在XmlDocument上使用Save()时渲染空的XML元素,如<this />,而不是<this> </ this>

Mic*_*rne 2 .net xml

我有一个.NET C#解决方案,它可以构建复杂的XmlDocument,然后通过线路将其发送到外部API.由于API中的烦人怪癖,我需要能够渲染空元素,如:

<empty />
Run Code Online (Sandbox Code Playgroud)

不像这样(默认情况下似乎发生):

<empty></empty>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们使用.NET XmlDocument对象并准备将其作为HttpWebRequest我将XML文档编写为字节数组的一部分发送,代码如下:

MemoryStream ms = new MemoryStream();
xmlDoc.Save(ms);
ms.Position = 0;
byte[] postData = new byte[ms.Length];
ms.Read(postData, 0, postData.Length);
ms.Close();
Run Code Online (Sandbox Code Playgroud)

postData然后使用以下方法将其写入Web请求:

webRequest.GetRequestStream().Write(postData, 0, postData.Length);

谢谢!

car*_*ira 5

XmlDocument保留了元素在加载XML时的定义方式 - 如果输入有空元素,它将输出它们,如果它们是Element/EndElement,它也会保留它们.您可以预处理XmlDocument节点,可以使用一个简单的递归函数(如下所示).

public class StackOverflow_6529793
{
    public static void Test()
    {
        XmlDocument doc = new XmlDocument();
        string xml = "<root><item1></item1><item2></item2><item3/><item4 a='b'></item4><a:item5 xmlns:a='ns'></a:item5></root>";
        doc.LoadXml(xml);
        MemoryStream ms = new MemoryStream();
        doc.Save(ms);
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

        CollapseEmptyElements(doc.DocumentElement);
        ms = new MemoryStream();
        doc.Save(ms);
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }
    static void CollapseEmptyElements(XmlElement node)
    {
        if (!node.IsEmpty && node.ChildNodes.Count == 0)
        {
            node.IsEmpty = true;
        }

        foreach (XmlNode child in node.ChildNodes)
        {
            if (child.NodeType == XmlNodeType.Element)
            {
                CollapseEmptyElements((XmlElement)child);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)