我创建了一个 MSXML6 DOM 文档,在序列化过程中我想控制空元素的序列化方式:
<tag></tag>
<tag/>
这个答案描述了 C# 的解决方案,但我正在寻找 MSXML 的 ActiveX 接口可能的东西。(对于 VB6 或一些脚本语言)
这非常混乱,但是我发现如果您在 MSXML 文档上使用 createElement 方法,您会(出于某种原因)获得一个 xml 元素,该元素会按照<tag />
格式进行序列化,因此您可以通过替换它们来强制元素像这样进行序列化使用您创建的具有相同名称的元素:
<!-- Contents of c:\xml.xml -->
<xml>
<element></element>
</xml>
在 Javascript 中(但希望很容易转换为 VbScript)
objXML = new ActiveXObject("MSXML2.DOMDocument.4.0");
objXML.load("c:\\xml.xml");
var xmlElement = objXML.childNodes[1];
var newElement = objXML.createElement(xmlElement.childNodes[0].tagName);
xmlElement.replaceChild(newElement, xmlElement.childNodes[0]);
相反,您可以<tag />
通过将 text 属性设置为 来强制展开未展开的元素""
:
newElement.text = "";
希望这会有所帮助——我知道这真的很可怕,但很有可能你首先需要能够做到这一点的事实已经足够可怕了,所以这种额外的可怕不会有太大的不同!:-p
创建一个向您的 VB6 应用程序公开必要的 C# 魔术功能的 COM 包装器应该不难。
using Interop=System.Runtime.InteropServices;
namespace MyNamespace
{
[Interop.GuidAttribute("...guid here...")]
[Interop.ComVisible(true)]
[Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
public partial class MyXmlWrapper
{
// expose methods in here that do the XML serialization the
// way you want to.
}
}
如果您以前没有这样做过,在 C# 中定义 COM 对象可能看起来很奇怪,但这并不难。