2010-06-09 146 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