有没有办法控制哪些标签在使用MSXML6进行序列化时崩溃?

时间:2009-10-05 13:31:43

标签: xml vb6 msxml msxml6

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

  1. <tag></tag>

  2. <tag/>

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

2 个答案:

答案 0 :(得分:2)

这非常混乱,但我发现如果你在MSXML文档上使用createElement方法,你会得到(出于某种原因)一个xml元素,它会按照<tag />格式生成,所以你可以强迫通过使用您使用相同名称创建的元素替换它们来像这样进行serailize:

<!-- 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]);

相反,您可以通过将text属性设置为<tag />来强制展开未展开的""元素:

newElement.text = "";

希望这会有所帮助 - 我知道这真的非常可怕,但事实上你需要能够做到这一点的事情已经非常可怕,所以这种额外的可怕性不会产生太大的影响! :-P

答案 1 :(得分:0)

创建一个向您的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对象似乎有些奇特,但并不难。