我有一个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>
元素。如何在循环中包含这些元素?
答案 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";