如何遍历 XmlDocument 并返回 csv

本文关键字:XmlDocument 返回 csv 遍历 何遍历 | 更新日期: 2023-09-27 17:57:13

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

如何遍历 XmlDocument 并返回 csv

我肯定会考虑用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