Как получить XML-узел через XPath

#xml #xpath #linq-to-xml

#xml #xpath #linq-to-xml

Вопрос:

У меня есть XML :

 <?xml version="1.0" encoding="utf-8" ?>
<Root>
    <Class>
        <Room>
            1
        </Room>
        <Subject>
            English
        </Subject>
    </Class>
    <Class>
        <Room>
            2
        </Room>
        <Subject>
            Maths
        </Subject>
    </Class>
</Root>
  

Я использую его в качестве источника данных для своей сетки, для этого я использовал xmldatasource и xpath.

 PrimaryDataSource = new XmlDataSource();
PrimaryDataSource.EnableCaching = false;
PrimaryDataSource.Data = ClassXML;
return PrimaryDataSource;
  

и доступ к узлам на стороне клиента как:
XPath(«Комната») и XPath («Тема»)

Который дает мне значения этих конкретных атрибутов.

Теперь я хочу получить всю корневую форму XML на стороне клиента, Class только один корень.

 <Class>
    <Room>
        1
    </Room>
    <Subject>
        English
    </Subject>
</Class>
  

Может кто-нибудь сказать мне, как я могу получить его через XPath или другие методы.

Ответ №1:

Если вам нужен первый «класс», просто используйте:

 (//Class)[1]
  

Ответ №2:

Поскольку существует только один корень, вы также можете использовать XPATH:

 /Class
  

Ответ №3:

Вы можете выбрать все классы, используя абсолютное выражение XPath:

 /Root/Class
  

или выражение оси потомка, например:

 //Class
  

который выберет набор узлов, содержащий все классы, независимо от их вложенности (если в иерархии есть Class элементы глубже, они также будут выбраны в этом случае.

С помощью позиционного предиката, подобного предложенному в ответе @ErezRobinson, вы можете выбирать классы в соответствии с их положением в контексте. Круглые скобки поместят его в глобальный контекст. Каждый разделенный косой чертой шаг в выражении XPath предоставляет контекст, который ограничивает область действия следующего шага или следующего предиката. И каждый предикат уменьшает набор узлов, отфильтровывая узлы, которые не соответствуют логическому выражению внутри него. (//Class)[1] это ярлык для (//Class)[position() = 1]

Вы также можете выбрать класс, соответствующий значениям его дочерних узлов с помощью предиката. Чтобы выбрать все Class элементы, у которых есть дочерний элемент Room со значением 2 , вы можете использовать:

 //Class[Room = '2']
  

Вы также можете выбрать по теме:

 //Class[Subject = 'Maths']
  

Наконец, когда у вас есть контекст, вы можете выбрать другие элементы в этой области. Например, вы можете получить Room номер Subject , когда English :

 //Class[Subject = 'English']/Room
  

Class[Subject = 'English'] Шаг в этом случае просто создает контекст для следующего шага, который эффективно выбирает узел или набор узлов.

Комментарии:

1. Я пробовал ваши предложения, но у меня это не сработало. чего я хочу: этот XML имеет одно КОРНЕВОЕ имя в качестве Root и два подкорневых класса [1] и Class [2] , я хочу получить один из корня класса, я имею в виду весь XML, который имеет корневой «Класс», меня не интересуют только значения элементая хочу получить всю часть xml.

2. В этом случае ответ @RoeiFinkelstein должен решить вашу проблему.