需要帮助阻止MSXML添加名称空间

时间:2010-01-16 22:53:25

标签: xml msxml msxml4

我正在使用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添加或删除命名空间的内容?

3 个答案:

答案 0 :(得分:2)

我明白了。

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

2)使用#1的修复,我最终得到一个空名称空间(xmlns =“”)。为了解决这个问题,我必须在创建节点时设置名称空间。在我创建节点之前,然后在单独的调用中添加了xmlns属性。

在:

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

现在:

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

答案 1 :(得分:0)

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

从您的引文中,您看起来好像创建了名为http://1的命名空间的child3节点,并且您需要使用http://2的命名空间创建它。

答案 2 :(得分:0)

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

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

一旦我将其固定在最顶层的xml标签中,我就可以将xml标签插入到文档中而无需看到xmlns =&#34;&#34;到处。

有趣的是,当您从头开始编写XML文档时,创建标记的层次结构,您将无法获得xmlns =&#34;&#34;标签