Как определить xpath для данных ниже XML? - PullRequest
1 голос
/ 28 февраля 2011

У меня есть данные 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 ...

Итак, cname для второго com.Узел domain.Products на самом деле совпадает с первым узлом com.domain.Products, оба являются 'class1', но если я получу значение cla__id / cname xpath, я смогу получить его правильно только для первого com.domain.Products.узел, второй узел com.domain.Products будет иметь только пустое значение, что неверно.

Как добиться правильного результата?Большое спасибо.

attach: Мой текущий Java-код smartgwt делает это следующим образом:

......
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 Ответ

1 голос
/ 28 февраля 2011

В 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, имеющего id из 2, равно:

/*/*
  [id
  = 
   /*/*[id=2]/cla__id/@reference]
                           /cla__id/cname/text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...