我正在尝试遍历XmlDocument
对象并返回合理的csv。
我能够使用递归遍历所有节点
private StringBuilder findAllnodes(XmlNode node, StringBuilder buf) {
foreach (XmlNode n in node.ChildNodes) {
findAllnodes(n, buf);
if (n.NodeType == XmlNodeType.Text) {
buf.AppendFormat("{0}",n.InnerText.Trim());
}
else {
buf.AppendFormat("{0}, {1}", n.Name, n.InnerText.Trim());
}
}
return buf;
}
并将值写入字符串,但它没有正确显示。
我试图解析的XML字符串有n个键值对(可能会很长),并且可能有多个重复的部分。这是一个例子:
那里有什么快捷方便吗?我真的希望有一些本土图书馆,因为我觉得这将是一个非常常见的补救任务。
更新:示例XML
<?xml version="1.0" encoding="UTF-8"?>
<soap:Body>
<perfOCRResp xmlns="http://com.speedMonkey.getthatmoney.pitt.edu">
<perfOCRResults>
<status>SUCCESS</status>
<clientID>testApp</clientID>
<outputs>
<ocrOut>
<clientID>testApp</clientID>
<isSuccess>true</isSuccess>
<message>SUCESS</message>
<classificTemp>monkeyTemp</classificTemp>
<recogVals>
<KeyValue>
<key>tempCode</key>
<value>NLN000001</value>
</KeyValue>
<KeyValue>
<key>tempName</key>
<value>monkeyNote</value>
</KeyValue>
<KeyValue>
<key>tempCode</key>
<value>NLN000001</value>
</KeyValue>
<KeyValue>
<key>Borrower</key>
<value>Monkey See</value>
</KeyValue>
<KeyValue>
<key>solute</key>
<value>MonkeyDue</value>
</KeyValue>
<KeyValue>
<key>whatsThis</key>
<value>who cares</value>
</KeyValue>
<KeyValue>
<key>solute</key>
<value>NLN000001</value>
</KeyValue>
<KeyValue>
<key>imageID</key>
<value>thatImage</value>
</KeyValue>
</recogVals>
</ocrOut>
<outputs>
</perfOCRResults>
</perfOCRResp>
</soap:Body
ocrout可以重复多次。我不知道你是否能说出来,但那里可能存在不确定数量的键值对。这是我认为通过递归遍历可能是最好的选择的原因之一。但就像我说的那样,我到达了所有的节点,但它只是丑陋而没有秩序。不是有史以来最好的CSV。希望有一个像JSON一样的简单库。
答案 0 :(得分:1)
我当然会考虑使用LINQ-to-XML来做这件事。它简单得多。这是代码:
var ns = XNamespace.Get("http://com.speedMonkey.getthatmoney.pitt.edu");
var csv =
String.Join(Environment.NewLine,
doc
.Descendants(ns + "KeyValue")
.Select(e => String.Format("{0},{1}",
e.Element(ns + "key").Value.Trim(),
e.Element(ns + "value").Value.Trim())));
我得到的结果是:
tempCode,NLN000001
tempName,monkeyNote
tempCode,NLN000001
Borrower,Monkey See
solute,MonkeyDue
whatsThis,who cares
solute,NLN000001
imageID,thatImage