2010-06-09 157 views
11

我解析一个xml文档,我需要找出gid(一个属性)值(3810)。基于SelectSingleNode()。我发现找到属性名称和它的值并不容易。如何使用SelectSingleNode获取属性值?

我可以使用这种方法,还是必须切换到另一种方式。

附加是我的代码。

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

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

[更新06/10/2010]

  1. 的XML文件是一个复杂的文件。包括数以千计的gid。但是对于每个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以上的成员。然后我试图找出哪个gid项目被选中。

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

回答

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; 
    } 
} 
+0

鉴于问题'book.Attributes'中的代码是空的(Count = 0)。 – ChrisF 2010-06-09 09:46:13

+0

你好。从'book.Attributes.Count = 0',在运行时无法找到'gid'。 – 2010-06-09 09:47:58

+0

实际上,在我真正的xml文件中有数千个gid。我想用'selectSingleNode()'来解析元素层。我认为这对我来说是一个快速的方法。然后我可以找到独特的gid。 – 2010-06-09 09:53:58

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

+0

鉴于问题book.Attributes中的代码是空的(Count = 0)。 – ChrisF 2010-06-09 09:50:33

+0

顺便说一句,将抛出'NullReferenceException'的情况下,找不到 – abatishchev 2010-06-09 09:53:16

+0

@mdma,我试过'book = root.SelectSingleNode(“属性[AttrDir [@ name ='EFEM']/AttrDir [@ name ='Aligner']/AttrDir [@名称= 'SequenceID']/AttrObj [@文本= 'Slot01']/@ GID]“);'。书obj运作良好。但是 编译器错误'XmlAttribute gidAttribute = book.Attributes.GetNamedItem(“gid”);':*错误CS0266:无法隐式地将类型'System.Xml.XmlNode'转换为'System.Xml.XmlAttribute'。存在明确的转换(您是否缺少演员?)* – 2010-06-10 00:51:14

0

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

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

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

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