有没有办法控制在使用 MSXML6 序列化期间哪些标签折叠/自关闭?

问题描述 投票:0回答:2

我创建一个 MSXML6 DOM 文档,在序列化期间我想控制空元素的序列化方式:

  1. <tag></tag>

  2. <tag/>

This answer 描述了 C# 的解决方案,但我正在寻找 MSXML 的 ActiveX 接口可能的东西。 (对于 VB6 或某些脚本语言)

xml vb6 msxml msxml6
2个回答
3
投票

这非常混乱,但我发现如果你在 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


0
投票

创建一个 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 对象可能看起来很奇怪,但其实并不难。

© www.soinside.com 2019 - 2024. All rights reserved.