2010-10-12 6 views
1

Я довольно новичок в XML-разработчике. У меня было несколько вопросов, касающихся разбора XML с помощью XPATH и libxml.libxml2 XPATH - выбор подмножества данных из XML

У меня есть XML-структуру:

<resultset> 
     <result count=1> 
      <row> 
       <name> He-Man! </name> 
       <home> Greyskull </home> 
      <row> 
     </result> 
     <result count=2> 
      <row> 
       <name> Spider-Man</name> 
       <home> Some downtown apartment </home> 
      <row> 
      <row> 
       <name> Disco-Man!</name> 
       <home> The 70's dance floor </home> 
      <row> 
     </result> 
<resultset> 

Мне нужно, чтобы выбрать имена из этого XML, но где отсчет 2, мне это нужно только с первой записи. Я просмотрел несколько руководств, но я не могу придумать запрос XPATH, который будет служить этой цели.

/name выберет все элементы названия.

/результат [@count> 1]/row [1]/name |/result [@count = 1]/row/name

Можно ли это сделать с помощью XPATH? Лучше ли это делать через XPATH или ходя дерево XML?

Может ли кто-нибудь указать мне на некоторые сложные поиски через XML?

Редактировать: для фактического сценария требуется выбрать подмножество строки XML, которые могут быть вложены на 2 уровня в разы. Это звучит так, как будто мне нужно ИЛИ '|' многие пути для выбора узлов, которые мне нужны ... Я не уверен, что это было бы эффективно, в отличие от ходьбы по дереву ... Вышеприведенное типизировано для репликации проблемы :)

Спасибо!

+0

Xpath Ходит дерево XML. –

+0

Возможно, я неправильно понял вопрос, или ваш пример упрощен, но не будет ли '/ result/row [1]/name' работать в вашем примере? –

ответ

0

Попробуйте XPath -

/resultset/result[@count=2]/row/name

Это даст список всех узлов, подпадающих под действие этого XPath. Из этого просто возьмите первый элемент (так как вам нужна только первая запись).

+0

+1 Хороший ответ. Вы писали: * Из этого просто возьмите первый элемент *. В XPath это будет: '(/ resultset/result [@ count = 2]/row/name) [1]'. – 2010-10-12 15:53:23

+0

@alejandro. Yupp, вот что вы делаете, чтобы получить первый элемент. Также, насколько это возможно, попробуйте использовать абсолютный путь в XPaths. Таким образом, вы уверены, что получите то, что хотите, а не подбираете некоторые поддельные узлы. –

+0

О * некоторые поддельные узлы, которые выбираются *, то есть потому, что ось имеет больше приоритета, чем предикаты, а предикаты положения следуют направлению оси. Вот почему я завершаю ваш ответ с выражением * first * – 2010-10-12 16:48:30

0

Я бы, скорее всего, упростил свой xpath и просто извлек оба случая, а затем обогнул оба набора узлов.

Если вам нужно спуститься по одному маршруту xpath, вы должны попробовать свои выражения xpath в том, что позволяет вам вводить их в прямом эфире, а не перекомпилировать код C/C++. Вы должны сделать это, загрузив свой XML в firefox и используя firebug - например, набрав $ x ('// name') в консоли firebug, вы получите три узла.

Примечания, однако, что ваш XML является недействительным ... У вас есть куча «< строка >„с, которая должна быть“</строкой >» и то же самым для «< результирующего >» и ваши счетчики должны быть

<result count="1"> 

ie с кавычками вокруг значения.

+0

Спасибо, я просто набрал упрощенную версию той, которую я пытаюсь разобрать :) –

Смежные вопросы