使用XmlDocument进行XML遍历

7
我有以下代码,用于遍历XML:
private void btn_readXML_Click(object sender, EventArgs e)
{
        var doc = new XmlDocument();
        doc.Load("e:\\contacts.xml");
        // Load xml document.            
        TraverseNodes(doc.ChildNodes);     
}

static List<string> xmlnodes = new List<string>();
private static void TraverseNodes(XmlNodeList nodes)
{     
       foreach (XmlNode node in nodes)
       {                   
              List<string> temp = new List<string>();                  
              temp.Add("Node name: " + node.Name.ToString());
              XmlAttributeCollection xmlAttributes = node.Attributes;

              foreach (XmlAttribute at in xmlAttributes)
              {
                   temp.Add("  Atrib: " + at.Name + ": " + at.Value);
              }

               xmlnodes.AddRange(temp);
               TraverseNodes(node.ChildNodes);     
}

但我遇到的问题是,我不想遍历整个文档,我只想遍历具有属性“X”的节点及其子节点。请注意,我不知道节点在哪里。因此,我需要做的基本上是找出该节点是否存在(它将具有属性“X”。这就是我确定它是正确节点的方式),如果是,则获取其子节点。

有人能帮帮我吗?我对XML还很陌生。提前谢谢!


3
你知道XPath吗?你可以使用XmlDocument类的SelectSingleNodeSelectNodes - Hassan
我不确定我完全了解XPath,但我尝试了一小段。我不知道节点的位置在哪里。我不能像那样给出路径。 - Ekta
我已经更新了答案。您可以选择文档中具有属性“X”的所有元素。 - Hassan
2个回答

5
假设您的XML具有以下结构:
<Contacts>
   <Contact X="abc">
       <Child1></Child1>
   </Contact>

   <Contact X="def">
       <Child2></Child2>
   </Contact>
</Contacts>

使用XmlNode.SelectNodes的示例代码:

var doc = new XmlDocument();
doc.Load("e:\\contacts.xml");

//get root element of document   
XmlElement root = doc.DocumentElement;
//select all contact element having attribute X
XmlNodeList nodeList = root.SelectNodes("//Contact[@X]");
//loop through the nodelist
foreach (XmlNode xNode in nodeList)
{       
    //traverse all childs of the node
}

针对不同的XPath查询,请参见此链接

更新

如果您想选择文档中具有属性X的所有元素,无论它们存在于何处。 您可以使用以下语法:

//select all elements in the doucment having attribute X
XmlNodeList nodeList = root.SelectNodes("//*[@X]");

没问题。我能不能像这样做一些事情,XmlNodeList nodeList = root.SelectNodes("//Contact[@X]")=="Y";我的意思是,在这里我正在给出属性的名称。我能否通过属性的值进行选择? - Ekta
你可以这样做:root.SelectNodes("//Contact[@X='Y']"); - Hassan

0

试试这个:

private void btn_readXML_Click(object sender, EventArgs e)
{
        var doc = new XmlDocument();
        doc.Load("e:\\contacts.xml");

        var nodes = xdoc.SelectNodes("//yournodename");
        // ex. 
        // var nodes = xdoc.SelectNodes("//Company");
        TraverseNodes(nodes);   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接