如何在XercesDOMParser中传递Xml

How to pass Xml in XercesDOMParser?

本文关键字:Xml XercesDOMParser      更新时间:2023-10-16

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

注意:请忽略标签

中的空白

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

解析器->setIncludeIgnorableWhitespace(false(

但是,只有当您根据DTD或模式进行验证时,空白才是"可忽略的",DTD或模式表示包含空白的元素不接受文本作为内容。如果您还没有进行验证,或者元素被声明为具有混合内容,那么空格就是文档的内容。

在您的情况下,您没有进行验证检查。因此,您可以做的是,在将节点附加为子节点之前,遍历所有节点,并删除仅具有基于空白、tab和'/n'的数据的文本节点(DOMNode::text_node(。这将解决你的问题。