0

我正在将一些 DOMNode 从一个文档移动到另一个文档;这里的代码快照

        XercesDOMParser *parser = new XercesDOMParser;
        parser->setValidationScheme(XercesDOMParser::Val_Auto);
        parser->setDoNamespaces(false);
        parser->setDoSchema(false);
        parser->setValidationSchemaFullChecking(false);
        parser->setCreateEntityReferenceNodes(false);

        // getDOMNodeForXMLString will pares the string and return the root DOMNode
        DOMNode* vendorExtnDomNode =  getDOMNodeForXMLString(*veField,parser);

       DOMNodeList* childList = vendorExtnDomNode->getChildNodes();
        if(childList)
        {
            DOMNode* childNode = NULL;
            for(childNode = vendorExtnDomNode->getFirstChild();childNode != NULL;childNode = childNode->getNextSibling())
            {
                DOMElement* newChild = (DOMElement*) Doc->importNode(childNode,true);
                veDomNode->appendChild(newChild);
            }
        }
        parser->resetDocumentPool();
        delete parser

如果 xml 字符串如下所示,则将其附加到 Doc

< my:root>
        < my:values>
                        < my:value1>10< /my:value1>
        < /my:values>
< /my:root>

但是如果字符串是这样的

< my:root>
            < my:values>
                            < my:value1>10< /my:value1>
                            < my:enum>
                                            < my:value2>10< /my:value1>     
                            < /my:enum>
            < /my:values>
< /my:root

然后我只能在 xml 转储中看到如下第一级层次结构字符串,为什么缺少重置

< my:root>
            < my:values>
                            < my:value1>10< /my:value1>
            < /my:values>
< /my:root>

注意:请忽略标签中的空格

4

1 回答 1

0

您正在解析的字符串在标签之间包含空格字符 '\n'(新行)、'\t'(制表符)和 ''(空格)。它们被解析为文本节点并附加到 DOM 树。这会导致转储 xml 出现问题。避免使用可以将解析器属性 includeWhiteSpace 设置为 false 的空格

解析器->setIncludeIgnorableWhitespace (false)

但是,只有当您针对 DTD 或模式进行验证时,空格才“可忽略”,该模式表示包含它们的元素不接受文本作为内容。如果您尚未验证,或者元素被声明为具有混合内容,则空格是文档内容的一部分。

在您的情况下,您没有验证检查。因此,您可以做的是在将节点附加为子节点之前,遍历所有节点并删除仅具有基于空格、制表符和“/n”的数据的文本节点 (DOMNode::TEXT_NODE)。这将解决您的问题。

于 2013-02-27T05:22:15.813 回答