Вопрос # XPath: Как получить узлы под указанным родительским узлом? - PullRequest
0 голосов
/ 28 октября 2009

Я новичок в Xpath и получил проблему. Я хочу, чтобы все узлы под конкретным родительским узлом! Я попробовал это с этим запросом, но получил только пустой результат! (

var ISDN_confs = from x in xdoc.XPathSelectedElements("//member[name='participantOne']//member[name='name']") 
                 select x;

Пример XML:

<methodResponse>
<params>
  <param>
    <value>
      <struct>
        <member>
           <name>calls</name>
              <value>
                <array>
                  <data>
                    <value>
                      <struct>
                        <member>
                           <name>uniqueId</name>
                           <value>
                              <int>6</int>
                           </value>
                         </member>
  <member>
    <name>participantOne</name>
    <value>
        <struct>
            <member>
                <name>uniqueId</name>
                <value>
                    <int>1609</int>
                </value>
            </member>
            <member>
                <name>protocol</name>
                <value>
                    <string>h323</string>
                </value>
            </member>
            <member>
                <name>incoming</name>
                <value>
                    <boolean>1</boolean>
                </value>
            </member>
            <member>
                <name>progress</name>
                <value>
                    <string>connected</string>
                </value>
            </member>
            <member>
                <name>fecc</name>
                <value>
                    <boolean>1</boolean>
                </value>
            </member>
            <member>
                <name>videoCodec</name>
                <value>
                    <string>h264</string>
                </value>
            </member>
            <member>
                <name>audioCodec</name>
                <value>
                    <string>g722</string>
                </value>
            </member>
            <member>
                <name>autoAttendant</name>
                <value>
                    <boolean>0</boolean>
                </value>
            </member>
            <member>
                <name>name</name>
                <value>
                    <string>Test Endpoints</string>
                </value>
            </member>
            <member>
                <name>number</name>
                <value>
                    <string>12345</string>
                </value>
            </member>
            <member>
                <name>ipAddress</name>
                <value>
                    <string>192.168.2.155</string>
                </value>
            </member>
            <member>
                <name>callIdentifier</name>
                <value>
                    <base64>CCCCVVVVVDDDDD</base64>
                </value>
            </member>
        </struct>
    </value>
</member>
<member>
<name>participantTwo</name>
<value>
<struct>
 <member>
 <name>name</name>
 <value>
 <string/>
 </value>
 </member>
 <member>
 <name>number</name>
 <value>
 <string>123456</string>
 </value>
 </member>
 <member>
 <name>channels</name>
 <value>
 <array>
 <data>
 <value>
 <int>1</int>
 </value>
 <value>
 <int>2</int>
 </value>
 </data>
 </array>
 </value>
 </member>
 </struct>
 </value>
 </member>
 </struct>
 </value>

Желаемый результат должен быть ограниченным изменением фактического выхода. Поэтому я не хочу всех имен-членов, но имен-членов в двух структурах без каналов-членов.

Я надеюсь, ясно, что я хочу! :)

Пример вывода:

<member>
   <name>name</name> 
     <value>
       <string>Test Endpoints</string> 
     </value>
</member>

В данный момент, с помощью вышеуказанного запроса, я получаю всех имен-членов, но это не то, что я хочу, как я сказал в комментариях ниже!

UPDATE --- Я попытался получить все имена-члены, у которых есть каналы-участники с этим запросом

var parts = from c in xdoc.XPathSelectElements("//member[name='name']")
                    where c.Element("name").Value == "channels" && c.Element("name").HasElements
                    select c;

но получите только пустой результат!

1 Ответ

1 голос
/ 28 октября 2009

Без просмотра примера документа и желаемого результата немного сложно увидеть, что вы на самом деле хотите, но обычно вы просто используете одно выражение XPath, которое также включает родительский элемент:

"//member[name='participantOne']/member[name='name']"

Если это не сработает, вы можете отредактировать вопрос, включив в него пример ввода и вывода.

На самом деле ваше последнее предложение немного сбивает с толку: имя родительского узла participantOne? И имя дочернего узла name? Тогда вы могли бы просто написать:

"//participantOne/name"

Обновление

Так как узел member [name = 'memberOne'] не является прямым родителем, но является ацетором, вы должны будете использовать

//member[name='participantOne']//member[name='name']

как ваше выражение XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...