强制 XDocument 中的空元素展开

Posted

技术标签:

【中文标题】强制 XDocument 中的空元素展开【英文标题】:Force empty elements in XDocument to expand 【发布时间】:2011-09-12 14:25:13 【问题描述】:

我们必须将 xml 发送到一个黑盒处理器,它不能正确处理收缩的空元素,当然,我们不能直接改变它。

如果我们发送:

<element />

我们回来了:

<element>\n</element>  

呈现为

    <element>
</element> 

这会导致我们的客户流程反应不佳

我们应该(需要)回来:

<element></element> 

当我们发送过来时:

<element></element>

结果如期而至,所以我们需要发送

<element></element>

不是

到黑匣子。

在检查空元素的属性时,我们注意到

<element /> 

注册 isEmpty == true while

<element></element> 

将 isEmpty 注册为 false,因此作为一次黑客尝试,我们运行了这个循环:

        foreach (XElement feature in _xDocument.Descendants("feature").Where(feature => feature.Element("expiry").IsEmpty))
        
            feature.Element("expiry").Value = string.Empty;
        

在调试中,我们确定 isEmpty 变为 false,在调试环境中将其发送到黑盒时,一切都很好,但是当我们部署到我们的开发服务器(当然还有测试和生产)时,我们仍然结束看到黑盒子的输出就好像标签是空的一样。

我们如何强制 XML 文档中的所有空元素始终呈现为扩展标签?

目前这对我们来说是一个关键的错误修复 - 下游客户正在受到负面影响。

非常感谢!

【问题讨论】:

【参考方案1】:

看这里:

Render Empty XML Elements as Parent Elements

【讨论】:

我将尝试扩展 XmlTextWriter - 我们的代码当前正在使用 StringWriter,但这可能只是解决问题。 这更奇怪,因为我们在开发机器上实施的修复无法在开发服务器(或测试/生产)上工作。这可以完美地在本地运行以强制使用 xml 格式 - 不幸的是,我们的黑匣子仍然表现不佳。我开始怀疑我在这里解决了错误的问题,但无论如何谢谢。

以上是关于强制 XDocument 中的空元素展开的主要内容,如果未能解决你的问题,请参考以下文章

强制 XDocument 使用 UTF-8 编码写入字符串

VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement

bootstrap-select 从关闭状态重新打开时的空选项

XDocument.Validate - 错误元素的预期数据类型

C# XDocument 如何使用 linq 过滤元素

使用 XDocument 和 Linq 读取 XML - 检查元素是不是为 NULL?