如何使用SelectSingleNode获取属性值?

我正在解析一个xml文档,我需要找出gid(属性)值(3810)。

基于SelectSingleNode() 。 我发现找到属性名称和它的值并不容易。

我可以使用此方法还是必须切换到其他方式。

附上是我的代码。

如何使用book obj获取gid的属性值3810 。 谢谢。

我的test.xml文件如下

               

我写了test.cs如下

 public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.Load("test.xml"); XmlNode book; XmlNode root = doc.DocumentElement; book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]"); Console.WriteLine("Display the modified XML document...."); doc.Save(Console.Out); } } 

[更新06/10/2010]

  1. xml文件是一个复杂的文件。 包括数以千计的gids。 但对于每个Xpath,gid都是独一无二的。

  2. 我将xml文件加载到TreeView控件。 this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); 。 发生treeView1_AfterSelect事件时, e.Node.FullPath将作为字符串值返回。

  3. 我解析字符串值e.Node.FullPath 。 然后我得到了XPath Above的成员。 然后我试图找到选择了哪个gid项目。

我确实需要找到gid值作为返回值。

你可以写

 XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid"); String gidValue = null; if (gidAttribute!=null) value = gidAttribute.Value; 

或者,展开Xpath以获取属性,例如

 Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid 

如果@gid是唯一的,那么您可以简单地使用Xpath

 "//AttrObj[@gid='3810']" 

获取具有给定id的所需节点。 但请注意,每个请求都将搜索整个文档。 获取所有节点,然后将它们放在一个由id键入的地图中会更有效。

 "//AttrObj[@gid]" 

使用XmlNode.SelectNodes获取具有@gid属性的所有AttrObj的列表。

您可以查询XmlDocument本身而不是DocumentRoot

 XmlDocument doc = new XmlDocument(); XmlNode book = doc.SelectSingleNode(".."); if (book != null) { XmlAttribute gid = book.Attributes["gid"]; if (gid != null) { string value = gid.Value; } } 

这里的问题是他们的XPath都错了。 你有这个:

 Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']] 

哪个会选择或不选择Attributes元素,具体取决于是否所有名称都匹配。 这个XPath应该直接带你到你想要的gid属性:

 Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid