如何遍历XmlDocument并返回一个csv?

时间:2015-06-20 22:44:35

标签: c# xml csv

我正在尝试遍历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一样的简单库。

1 个答案:

答案 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