Использование XPATH для доступа к элементам XML (было: хорошее руководство по изучению xpath)

#c# #xml #xpath

#c# #xml #xpath

Вопрос:

Я пытаюсь изучить XPath. Теория кажется чрезвычайно простой, за исключением того факта, что она не работает.

Я пытаюсь получить содержимое каждого целевого элемента

 XPathDocument doc = new XPathDocument(sPath);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("/doc/file/body/trans-unit/target");
XPathNodeIterator iterator = nav.Select(expr);

while (iterator.MoveNext())
{
    XPathNavigator nav2 = iterator.Current.Clone();
    sbDoc.Append(nav2.InnerXml);
}
  

XML-документ выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
<doc version="1.2">
  <file original="affiliate.php" source-language="EN-US" target-language="FR-FR" datatype="php">
    <header>
      <skl>
        <external-file href="affiliate.php"/>
      </skl>
    </header>
    <body>
      <trans-unit id="tu1">
        <source xml:lang="EN-US">Your Program Details</source>
        <target xml:lang="FR-FR">Your Program Details</target>
      </trans-unit>
      <trans-unit id="tu2">
        <source xml:lang="EN-US">Status</source>
        <target xml:lang="FR-FR">Status</target>
      </trans-unit>
  

Это почти слово в слово из руководства, но я не могу заставить его работать. Когда итератор создается в режиме отладки, я вижу, что документ загружен, но итератор не находит результата и пропускает цикл While.

Вероятно, я делаю что-то чрезвычайно глупое, но что?

Кто-нибудь знает, где я могу найти хорошее, надежное руководство по XPATH?


Спасибо всем. Оказывается, я проигнорировал тот факт, что существовало пространство имен (которое я удалил при упрощении XML-кода, поскольку не понимал, что это важно), и с добавлением менеджера пространств имен код работает нормально.

Сейчас я изучаю предложенные учебные пособия по XPATH, и они выглядят хорошо.

Ответ №1:

Возможно, XML не тот, который вы опубликовали, но имеет объявление пространства имен по умолчанию. Это основная причина, по которой выражения XPath, написанные новичками, не выбирают то, что они хотят выбрать. Вам понадобится XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx в таком случае.

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

1. Спасибо Мартин. Вы правы, в оригинале было пространство имен, которое я удалил при «упрощении» XML-файла, и, конечно, теперь оно работает.

2. @Sylverdrag: И как этот ответ соответствует названию вашего вопроса «Хорошее руководство по изучению xpath» . Я думаю, вам следует это отредактировать.

3. @Alejandro: Это был вопрос 2 в 1, и мне вроде как пришлось передать его человеку, которому удастся выявить основную проблему, хотя я поддержал хорошие ответы из руководства.

Ответ №2:

Я бы выбрал классический учебник по W3Schools. Вот как я научился, и это помогло мне отлично. Определенно охватывает все основы.

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

1. Похоже, отличное руководство. Спасибо!

Ответ №3:

Ответ №4:

Я обнаружил, что руководства по zvon довольно хороши.

Вот руководство по XPath.

Ответ №5:

Я всегда находил этот учебник / ссылку очень полезной …http://zvon.org/comp/r/tut-XPath_1.html #

Обновить
Я использовал ваш код и XML-документ и смог получить целевые элементы без проблем. Мне пришлось закрыть ваши <body>, <file> and <doc> элементы в конце вашего XML-документа, но я предполагаю, что это проблема с вырезанием и вставкой. Я предполагаю, что мой вопрос был бы (и это слишком очевидно), вы уверены, что XML-документ загружается и что тот, который загружается, действительно содержит содержимое, к которому вы стремитесь? Я скопировал ваш XML-документ и жестко запрограммировал путь в XPathDocument конструкторе, и все работало нормально (это означает, что StringBuilder получил текст из <target> элементов).

Также пробовал кодировку ANSI и UTF-8 — никаких проблем.

Я использую VS2010 для своей среды разработки.

Ответ №6:

http://www.w3schools.com/xsl/xpath_intro.asp

Вверху есть руководство, а также ссылка на xpath.

Ответ №7:

Я опаздываю на вечеринку, но опубликую сообщение для ищущих.

Получите XPathbuilder. Если вы хотите изучить xpath, получите этот инструмент, образец скрученного XML-файла, откройте раздел справки в xpath и попробуйте.

Я использую его прямо сейчас, и я не могу поверить, что мне потребовалось 5 минут, чтобы выбрать то, что мне нужно. (файл конфигурации кошмара в виде xml).

Ответ №8:

jQuery поддерживает базовое выражение XPath, вы можете использовать его для практики написания селекторов XPath.

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

1. Ja! Ja! Мы всегда видим ответы на технические вопросы о javascript (и даже о CSS), рекомендующие использовать библиотеку, подобную jQuery. Но я никогда не видел, чтобы это рекомендовалось в качестве руководства!

Ответ №9:

Я обнаружил, что в .Net отсутствует поддержка строго типизированного xpath. Вот библиотека для генерации xpath с использованием выражений linq-esq.

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

Пример:

  var xpath = CreateXpath.Where(e => e.TargetElementName == "td" amp;amp; 
                                    e.TargetElementText.Contains("my test"));

 xpath generated: //td[contains(text(),'my test')]