我有一个.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);
谢谢!
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)
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |