我创建一个 MSXML6 DOM 文档,在序列化期间我想控制空元素的序列化方式:
<tag></tag>
<tag/>
This answer 描述了 C# 的解决方案,但我正在寻找 MSXML 的 ActiveX 接口可能的东西。 (对于 VB6 或某些脚本语言)
这非常混乱,但我发现如果你在 MSXML 文档上使用 createElement 方法,你会(出于某种原因)得到一个序列化为
<tag />
格式的 xml 元素,因此你可以强制元素像通过用您创建的同名元素替换它们:
<!-- 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 />
:来强制未展开的
""
元素向外展开
newElement.text = "";
希望这会有所帮助——我知道这真的很可怕,但很可能你需要能够首先做到这一点的事实已经足够可怕了,所以这种额外的可怕不会有太大的不同! :-p
创建一个 COM 包装器应该不难,它向您的 VB6 应用程序公开必要的 C# 魔法功能。
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 对象可能看起来很奇怪,但其实并不难。