复制由 XMLWriter 创建的 XML 文档的单个元素

Copy single element of XML document being created by XMLWriter

我的 C# 应用程序具有将对象列表 (inputList) 作为参数的方法,它使用 TextWriter 和 XMLWriter 创建一个 XML 字符串,代码如下,提交到网络服务。

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xw = XmlWriter.Create(writer, settings))
    {
        xw.WriteStartElement("submission");
        xw.WriteElementString("version", XMLversion);
        xw.WriteElementString("user", USER_NAME);

        foreach (var obj in inputList)
        {
            xw.WriteStartElement("node");
            xw.WriteElementString("data1", obj.data1.ToString());
            xw.WriteElementString("data2", obj.data2.ToString());
            xw.WriteElementString("data3", obj.data3.ToString());
            xw.WriteElementString("data4", obj.data4.ToString()); 
            xw.WriteEndElement();
        }

    }
    xmlFile = writer.ToString();
}

记录列表个人中每个项目的提交的要求之一。所以我想知道是否有更有效的方法在 foreach 循环中创建 XML 节点的字符串?

我考虑过之后将 XMLReader 与字符串一起使用,但这是一个全新的过程,虽然我知道我可以手动创建它,并且很乐意这样做,但我愿意接受其他建议.本质上,我正在寻找一种有效的技术来生成如下所示的字符串:

<node>
    <data1>obj.data1.ToString()</data1>
    <data2>obj.data2.ToString()</data2>
    <data3>obj.data3.ToString()</data3>
    <data4>obj.data4.ToString()</data4>
</node>

您的 XML 文档似乎不够大,无法保证使用 XmlWriter 和 XmlReader。假设它可以轻松地放入内存中,那么我会使用 XmlDocument,它允许您将节点的 OuterXml(或 InnerXml,如果您愿意)作为字符串。

var document = new XmlDocument();

var submission = document.CreateElement("submission");
document.AppendChild(submission);

var version = document.CreateElement("version");
submission.AppendChild(version);
var versionText = document.CreateTextNode(XMLversion);
version.AppendChild(versionText);

var user = document.CreateElement("user");
submission.AppendChild(user);
var userText = document.CreateTextNode(USER_NAME);
user.AppendChild(userText);

foreach (var obj in inputList)
{
    var node = document.CreateElement("node");
    submission.AppendChild(node);

    var data1 = document.CreateElement("data1");
    node.AppendChild(data1);
    var data1Text = document.CreateTextNode(obj.data1.ToString());
    data1.AppendChild(data1Text);

    // TODO: repeat last 4 lines for data2, data3 and data4

    Console.WriteLine(node.OuterXml);
}

Console.WriteLine(document.OuterXml);