关于xerces使用getElementById返回NULL的问题

dwtsteven 2009-09-23 12:35:45
各位大虾,小弟最近使用xerces-c解析XML文件,然后调用getElementById根据属性xml:id取节点时,发现返回的结果为NULL,请问如何操作?


在网上找到一个可用的例子,不过太麻烦了,需要提供schema:
xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<FormDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://127.0.0.1/test.xsd">
<FormName id="a1">test form </FormName>
<FormTitle ReadFromDB="true" id="a2">Island</FormTitle>
</FormDefinition>


schema如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="FormDefinition">
<xs:complexType>
<xs:sequence>
<xs:element name="FormName" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

</xs:element>
<xs:element name="FormTitle" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ReadFromDB" type="xs:boolean" use="required"/>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>


使用上述的文件,并且设置一下属性:
domParser->setFeature(xercesc::XMLUni::fgDOMNamespaces, true);
domParser->setFeature(xercesc::XMLUni::fgXercesSchema, true);
domParser->setFeature(xercesc::XMLUni::fgDOMValidation, true);
domParser->setFeature(xercesc::XMLUni::fgDOMValidateIfSchema, true);
domParser->setFeature(xercesc::XMLUni::fgXercesSchemaFullChecking, true);


这样就可以通过getElementById获取到正确的节点。

请问如果不想使用schema,而只是使用xml:id属性的话,应该如何操作呢?
...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwtsteven 2009-09-24
  • 打赏
  • 举报
回复
问题解决了。
需要手动设置id,遍历整个DOM,对于拥有namespace为xercesc::XMLUni::fgXMLURIName的id属性,都设置该id类型,因为w3标准本应该是这样的。一个简单的循环就搞定了。

int buildDocumentIndex(xercesc::DOMElement* node)
{
static XMLCh id[]={'i','d',0};

if(node->hasAttributeNS(xercesc::XMLUni::fgXMLURIName,id))
node->setIdAttributeNS(xercesc::XMLUni::fgXMLURIName,id);

for(DOMNode*IT=node->getFirstChild();
IT!=NULL;IT=IT->getNextSibling())
{
if(IT->getNodeType()==xercesc::DOMNode::ELEMENT_NODE)
buildDocumentIndex((xercesc::DOMElement*)IT);
}
}
dwtsteven 2009-09-23
  • 打赏
  • 举报
回复
自己在顶一下
dwtsteven 2009-09-23
  • 打赏
  • 举报
回复
自己在顶一下
thy38 2009-09-23
  • 打赏
  • 举报
回复
米用过,帮顶
whg01 2009-09-23
  • 打赏
  • 举报
回复
没用过,帮忙顶一下。都沉到第3页了。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧