#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 должен решить вашу проблему.