如何为下面的xml数据定义xpath?

时间:2011-02-28 07:49:38

标签: xml xpath

我有一个xml数据如下:

<list>
    <com.domain.Products>
        <cla__id>
          <cname>class1</cname>
          <id>1</id>
        </cla__id>
        <name>pname1</name>
        <id>1</id>
    </com.domain.Products>

    <com.domain.Products>
        <cla__id reference="../../com.domain.Products/cla__id"/>
        <name>pname2</name>
        <id>2</id>
    </com.domain.Products>
</list>

我想使用xpath获取cname节点的值(值为'class1'),而对于第二个com.domain.Products节点,它只是对cla__id节点的引用,这正好是与第一个com.domain.Products节点...

相同

因此,第二个com.domain.Products节点的cname实际上与第一个com.domain.Products节点相同,都是'class1',但如果我使用cla__id / cname xpath来获取值,我可以只有第一个com.domain.Products节点正确获取它,第二个com.domain.Products节点才会有空值,这是错误的。

如何获得正确的结果?非常感谢。

attach:我当前的smartgwt java代码这样做:

......
private ProductsDS(String id) {
String recordName = "com.domain.Products";
setID(id);
setDataFormat(DSDataFormat.XML);
setRecordXPath("//" + recordName);

DataSourceField pkField = new DataSourceField("id", FieldType.INTEGER, "id");
pkField.setHidden(true);
pkField.setPrimaryKey(true);
DataSourceField claIdField = new DataSourceField("cla__id/cname", FieldType.TEXT, "classtype");
claIdField.setValueXPath("cla__id/cname");
......

ps:只需重新编辑两次以使帖子更好......

1 个答案:

答案 0 :(得分:1)

在XPath 1.0和XPath 2.0中无法执行动态(不包含在XPath表达式中,但已生成)XPath表达式

因此,无法动态评估对嵌入另一个XML元素的元素的引用,其中引用是XPath表达式。

建议的解决方案:提供一种唯一标识元素的新方法(例如为其提供唯一的id属性),并使用此属性的值作为元素的引用:

<list>
    <com.domain.Products>
        <cla__id>
            <cname>class1</cname>
            <id>1</id>
        </cla__id>
        <name>pname1</name>
        <id>1</id>
    </com.domain.Products>
    <com.domain.Products>
        <cla__id reference="1"/>
        <name>pname2</name>
        <id>2</id>
    </com.domain.Products>
</list>

然后,具有cname com.domain.Products的{​​{1}}元素的id值为:

2