在XmlDocument上使用Save()时,呈现<this>,而不是<this> </this>这样的空XML元素</this>

时间:2011-06-30 03:58:30

标签: .net xml

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

<empty />

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

<empty></empty>

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

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

然后使用以下命令将postData写入Web请求:

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

谢谢!

2 个答案:

答案 0 :(得分: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);
            }
        }
    }
}

答案 1 :(得分:0)

正如您可能知道的那样,XML标准表明<empty /><empty></empty>完全等效,因此XmlDocument对象没有做错任何事。

您可能要做的是通过过滤器(可能是正则表达式)运行生成的XML,以将非最小化标记的实例更改为最小化标记形式。然后,将带有最小化标记的过滤后的XML发送到webRequest