使用c#循环遍历xml文件中的所有节点

时间:2015-09-21 08:11:06

标签: c# xml xmldocument

我有一个xml文档,其设置与此类似:

<invoice>
   <IssueDate>2015-09-07</IssueDate>
   <InvoiceType>380<InvoiceType>
   <AccountingSupplierParty>
        <Party>
             <EndpointID></EndpointID>
             <PartyName>
                  <Name>Company test</Name>
             </PartyName>
        </Party>
    </AccountingSupplierParty>
</invoice>

这只是整个xml文档的一小部分,只是为了显示文件的外观。

我想检查所有元素是否也有空值,例如本例中的EndpointID(我需要用NA替换空值)。

这是我到目前为止所做的:

public static void AddToEmptyElements()
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("testXml.xml");
    XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes;
    foreach (XmlNode node in nodes)
    {
        Console.WriteLine(node.Name);             
    }
}

但是,此代码仅循环遍历根节点的子节点,而不是所有孙子节点(或曾孙子节点),例如<Party><EndpointID>元素。如何在循环中包含这些元素?

2 个答案:

答案 0 :(得分:3)

我现在不在测试代码的环境中,但是不可能编写一个递归方法来循环到节点的下方吗?

像这样(未经测试的代码):

private static void handleNode(XmlNode node)
{
  if(node.HasChildNodes)
  {
    foreach(XmlNode child in node.ChildNodes)
    {
      handleNode(child);
    }
  }  
  else
    Console.WriteLine(node.Name);
}

然后调用此方法代替您的Console.WrintLine()

答案 1 :(得分:3)

正如Jon Skeet所说,你可以使用LINQ to XML来做到这一点。

XDocument xml = XDocument.Load(path);
var emptyElements = xml.Descendants().Where(xe => String.IsNullOrEmpty(xe.Value));
foreach (var xe in emptyElements)
   xe.Value = "NA";