【问题标题】:How to pass Xml in XercesDOMParser?如何在 XercesDOMParser 中传递 Xml?
【发布时间】:2013-02-11 21:57:38
【问题描述】:

我正在将一些 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 字符串如下所示,则将其附加到文档中

< 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>

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

【问题讨论】:

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


    【解决方案1】:

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

    解析器->setIncludeIgnorableWhitespace (false)

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 2014-02-28
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多