我有一个.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);
谢谢!
答案 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
。