如何使用SelectSingleNode获取属性值?

时间:2010-06-09 09:33:15

标签: c# xml xpath

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

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

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

附上我的代码。

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

我的test.xml文件如下

<?xml version="1.0" ?>
<root>
   <VersionInfo date="2007-11-28" version="1.0.0.2" />
   <Attributes>
      <AttrDir name="EFEM" DirID="1">
         <AttrDir name="Aligner" DirID="2">
            <AttrDir name="SequenceID" DirID="3">
               <AttrObj text="Slot01" gid="3810" unit="" scale="1" />
               <AttrObjCount value="1" />
           </AttrDir>
         </AttrDir>
      </AttrDir>
   </Attributes>
</root>

我写了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);
    }
}

[2010年6月10日更新]

  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. 我解析字符串Value e.Node.FullPath。然后我得到了XPath Above的成员。然后我试图找到选择了哪个gid项目。

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

3 个答案:

答案 0 :(得分:8)

你可以写

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的列表。

答案 1 :(得分:4)

您可以查询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;
    }
}

答案 2 :(得分:0)

这里的问题是他们的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