如何在XercesDOMParser中传递Xml?

时间:2013-02-26 12:36:21

标签: c++ xml xml-parsing xerces-c

我正在将一些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>

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

1 个答案:

答案 0 :(得分:0)

要解析的字符串包含空格字符'\ n'(新行),'\ t'(制表符)和标记之间的''(空格)。哪些被解析为文本节点并附加到DOM树。这会导致转储xml的问题。请避免使用空格,将解析器属性includeWhiteSpace设置为false

parser-&gt; setIncludeIgnorableWhitespace(false)

但是如果您正在验证DTD或模式,即包含它们的元素不接受文本作为内容,那么空格只是“可忽略”。如果您尚未验证,或者该元素被声明为具有混合内容,则该空格是其中的一部分 文件的内容。

在您的情况下,您没有验证检查。所以你可以做的就是在将node添加为child之前,遍历所有节点并删除只有基于空格,tab和'/ n'的数据的文本节点(DOMNode :: TEXT_NODE)。这将解决您的问题。