2

我正在使用 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 的命名空间?

4

3 回答 3

3

我想到了。

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

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

前:

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

现在:

pNode->createNode(NODE_ELEMENT, name, "namespace");
于 2010-01-16T23:29:30.597 回答
0

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

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

于 2010-01-16T22:57:27.177 回答
0

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

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

一旦我在最上面的 xml 标签中修复了它,我可以将 xml 标签插入到文档中,而不会在任何地方看到 xmlns=""。

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

于 2017-05-18T14:15:11.813 回答