【问题标题】:Is there a way to control which tags get collapsed during serialization with MSXML6?有没有办法控制在 MSXML6 序列化过程中哪些标签被折叠?
【发布时间】:2009-10-27 01:30:04
【问题描述】:

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

  1. <tag></tag>

  2. <tag/>

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

【问题讨论】:

  • 顺便问一下,你为什么要这个?这两种方式是等效的,并且被任何 XML 解析器平等对待。
  • 我必须准备一个文档,它是伪 XML。处理应用程序在折叠的标签上阻塞。 (还有很多其他东西,它们是完全有效的 XML,但由于某些类似 PHB 的决定不被该应用程序接受)
  • VB6 什么时候成为脚本语言了?给我的消息。
  • @Bob:不,不是,只是语法错误。
  • 似乎是 XHTML 和 IE5/6/7 的典型问题,其中 <br /><br/><script></script><script /> 的处理方式不同。这通常通过 XSLT 或后处理(即通过正则表达式运行)部分解决,您目前是否将 XSLT 与 MSXML 一起使用?顺便说一句,它是 “自闭合标签”,而不是 “折叠标签”

标签: xml vb6 msxml msxml6


【解决方案1】:

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

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

newElement.text = "";

希望这会有所帮助 - 我知道这真的很可怕,但很有可能你需要能够做到这一点的事实已经足够可怕了,所以这种额外的可怕不会有太大的不同! :-p

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多