【问题标题】:Need help stopping MSXML from adding namespaces需要帮助阻止 MSXML 添加命名空间
【发布时间】:2011-01-05 22:59:34
【问题描述】:

我正在使用 MSXML 4 生成以下 xml 字符串:

<?xml version="1.0">
<Parent_Element xmlns="http://1">
    <Child_One>
        <Child_Two xmlns="http://2">
            <Child_Three>
            </Child_Three>
        </Child_Two>
    </Child_One>
</Parent>

但是,我的 IXMLDOMDocument2Ptr 的输出始终包含 Child_Three 的命名空间:

<?xml version="1.0">
<Parent_Element xmlns="http://1">
    <Child_One>
        <Child_Two xmlns="http://2">
            <Child_Three xmlns="http://1">
            </Child_Three>
        </Child_Two>
    </Child_One>
</Parent>

我的理解是这种行为是 XML 标准的一部分,但是如果存在额外的命名空间,接收 xml 的系统会拒绝它。如果命名空间为空(即 xmlns=""),它也会拒绝 xml。

MSXML 中是否有避免为 Child_Three 添加或删除命名空间的方法?

【问题讨论】:

  • Child_Three 属于哪个命名空间?
  • 默认情况下,由于没有为 Child_Three 声明命名空间,因此它使用文档命名空间:http://1。我的理解是这是一个 W3C XML 标准。
  • 如果Two 获得默认命名空间(不带前缀),每个孩子都会使用该命名空间;所以Three 将是http://2

标签: xml msxml msxml4


【解决方案1】:

我想通了。

1) 我有一个缺陷,即使用文档命名空间而不是父节点中的命名空间。

2) 通过 #1 的修复,我最终得到了一个空的命名空间 (xmlns="")。为了纠正这一点,我必须在创建节点时设置命名空间。在我创建节点然后在单独的调用中添加 xmlns 属性之前。

之前:

pNode->createNode(NODE_ELEMENT, name, "");
pAttrib = pNode->createAttribute("xmlns")
pAttrib->put_NodeValue(namespace)

现在:

pNode->createNode(NODE_ELEMENT, name, "namespace");

【讨论】:

    【解决方案2】:

    MSXML 将准确地表示您告诉它要表示的命名空间。

    从您的报价来看,您创建的 child3 节点似乎使用了 http://1 的命名空间,而您需要使用 http://2 的命名空间创建它。

    【讨论】:

    • 我试过了,我得到了以下结果: 问题是命名空间包含在输出中。无论他的命名空间是什么,我都无法将其包含在输出中。
    • 您需要发布代码。但是,不允许任何有效的 XML 阅读器拒绝该“多余”命名空间。
    【解决方案3】:

    我找到了解决这个问题的方法。问题是 MSXML 无法处理损坏的命名空间...

    我最近遇到了一种情况,在最高级别的标签中,有一个 xmlns="http://...",但这是错误的。它应该是:xmlns:xsd="http://..."。

    一旦我在最顶层的 xml 标签中修复了这个问题,我就可以将 xml 标签插入到文档中,而不会到处看到 xmlns=""。

    有趣的是,当你从头开始编写 XML 文档时,创建标签的层​​次结构,你不会得到 xmlns="" 标签。

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多