如何使用XPath连接元素?

时间:2013-11-24 19:02:38

标签: xml xpath rdf

我用XPath分析XML文档,我有以下数据:

<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/57108">
    <rdf:type rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/>
    <dcterms:type rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defect</dcterms:type>
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">57108</dcterms:identifier>
    <dcterms:title rdf:parseType="Literal">
        The page does not scroll, Save Button not clickable
    </dcterms:title>
</rdf:Description>
<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/56645">
    <rdf:type rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/>
    <dcterms:type rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defect</dcterms:type>
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">56645</dcterms:identifier>
    <dcterms:title rdf:parseType="Literal">
        NewMobApp Android: behavior of the swipe is incorrect
    </dcterms:title>
</rdf:Description>

我要做的是格式化数据,以便得到以下输出:

57108 - The page does not scroll, Save Button not clickable
56645 - NewMobApp Android: behavior of the swipe is incorrect

这一切都可能吗?我试过了

String workItemNodes = (String) (xpath.evaluate(workItemMembersXPath, source, XPathConstants.STRING));

,其中

String workItemMembersXPath ="concat(//dcterms:identifier, //dcterms:title)";   

但它只返回第一个结果。我试图以某种方式把它放入NodeList,但我没有太多运气。我还是XPath的新手。

我是否走在正确的轨道上,这是否可行,是否有更好/更容易的方法?

2 个答案:

答案 0 :(得分:0)

首先:看起来您使用的是RDF格式,您可能需要考虑使用jena而不是xpath。其实我对rdf / jena不太熟悉。 RDF可以表示为XML,因此可以假设您可以使用XPath。

使用XPath我建议使用/text()来获取节点的文本内容,这可以帮助您克服title元素中的空行(实际标题的上方和下方)。

String workItemMembersXPath ="concat(//dcterms:identifier/text(), //dcterms:title/text())";   

答案 1 :(得分:0)

很抱歉没有直接回答,但我觉得这是重要的信息。

我建议您不要使用XPath处理RDF / XML。我们在工作中尝试过,这是一个可怕的,容易出错的想法。

您遇到的主要问题是您将访问的XML不是静态的。我不只是表示语句的数量,而是表示这些语句在RDF / XML中的表示。无论您使用什么来在RDF / XML中序列化图形,我都非常确定,不能保证每次都输出相同的输出。那就应该告诉你放弃使用XPath的想法。

例如,像这样表达图形是完全有效的:

<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/56645">
    <rdf:type rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/>
</rdf:Description>

<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/56645">
    <dcterms:type rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Defect</dcterms:type>
</rdf:Description>

<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/56645">
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">56645</dcterms:identifier>
</rdf:Description>

<rdf:Description rdf:about="https://<server>/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/56645">
    <dcterms:title rdf:parseType="Literal">
        NewMobApp Android: behavior of the swipe is incorrect
    </dcterms:title>
</rdf:Description>

这与上面的子图相同,只是略有不同。虽然一个XPath表达式可能适用于此,但如果您继续使用XPath利用RDF,您迟早会遇到问题,我可以向您保证。