以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML工具及XML开发环境 』  (http://bbs.xml.org.cn/list.asp?boardid=7)
----  关于xerces使用getElementById返回NULL的问[求助]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=7&rootid=&id=77393)


--  作者:dwtsteven
--  发布时间:9/23/2009 10:31:00 PM

--  关于xerces使用getElementById返回NULL的问[求助]
各位大虾,小弟最近使用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属性的话,应该如何操作呢?


--  作者:hexun831012
--  发布时间:9/24/2009 9:28:00 AM

--  
按照W3C DOM Level 3的标准来看,只有当一个属性,必须是属性,他在DTD里定义为ID才可以用getElementById。
--  作者:dwtsteven
--  发布时间:9/24/2009 11:35:00 AM

--  
问题解决了。

需要手动设置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);        
    }
}


--  作者:chenlltop
--  发布时间:10/7/2009 11:20:00 PM

--  
一位醉汉午夜以后才跌跌撞撞地往家赶,他家住在七楼,当他爬到六楼的时候,忽然觉得刚才喝酒时忘了唱卡拉OK了,于是[url=http://www.ta6678.cn]google排名优化[/url] [url=http://www.xxlsc.cn]关键词优化[/url] [url=http://www.axsw.com.cn]google排名[/url] [url=http://www.hanchi.com.cn]上海汽车租赁[/url] [url=http://www.hanchi.com.cn]上海租车[/url]放声唱了一句:“小城故事多”;这时楼下正好有一位小姐刚下夜班回来,她听到后,不由自主地接了一句:“充满喜和乐”。醉汉听到后很生气,就又跌跌撞撞地[url=http://www.6kh.net]上海网站优化[/url] [url=http://www.6kh.net]网站优化[/url] [url=http://www.qtseo.net]上海GOOGLE优化[/url] [url=http://www.qtseo.net]GOOGLE推广[/url] [url=http://www.qtseo.net]GOOGLE优化[/url]下楼来,走到四楼的时候,正好遇到那位小姐,于是顿喝:“站住!”,小姐以为遇见了强盗,吓得手足无措,连说,“大哥,我刚下夜班回来,真没有钱。”,醉汉又大吼:“住口!”,小姐又哆[url=http://www.qtseo.net]GOOGLE排名优化[/url] [url=http://www.6kh.net]google左侧优化[/url] [url=http://www.6kh.net]google优化[/url] [url=http://www.qtseo.net]GOOGLE排名[/url]嗦着说:“你...你把包拿去吧...”,醉汉这才结结吧吧地说:“告...告诉你,记...记住了,以...以后唱歌,自...自己起头!”
--  作者:dawnpeople
--  发布时间:3/27/2010 9:42:00 AM

--  
深圳市联森光电有限公司总部位于高新技术产业发达的深圳市宝安区。是一家专业从事LED显示屏研发、生产、销售与工程服务于一体的高科技企业。      公司汇集了大批高素质专业技术人才,[url=http://www.shtjjq.com/]加气混凝土设备[/url]
[url=http://www.shtjjq.com/]加气混凝土砌块[/url]
[url=http://www.shtjjq.com/]矿山选矿成套设备[/url]
[url=http://www.shtjjx.com]破碎机[/url]拥有现代化的生产设备与检测设备,实行了全自动化生产,高度保障了公司核心产品—LED显示屏的可靠性能,可及时满足客户的需求。
  联森光电沿革于90年代初,高层管理人员为我国最早从事LED显示屏应用开发的行业精英,具备近20年的技术开发和工程运营经历,所主持开发设计的国内外LED显示屏项目多达100余项,其中多个项目已成为LED显示领域的经典范例。

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
61.523ms