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

时间:2018-02-28 14:14:26

标签: c# xmlwriter textwriter

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

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>

1 个答案:

答案 0 :(得分:0)

您的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);