Using XPATH to access XML elements (was: Good tutorial to learn xpath)

22,811

Solution 1

Maybe the XML is not the one you posted but has a default namespace declaration. That is the main reason why XPath expressions written by beginners don't select what they want to select. You would need an XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx in that case.

Solution 2

I'd go for the classic W3Schools tutorial. That's how I learnt, and it did me fine. Definitely covers all the basics.

Solution 3

MSDN XPath syntax

Solution 4

I found that the tutorials on zvon are quite good.

Here is the XPath tutorial.

Solution 5

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

There is a tutorial in the top and also xpath reference.

Share:
22,811
Sylverdrag
Author by

Sylverdrag

Updated on August 11, 2020

Comments

  • Sylverdrag
    Sylverdrag almost 4 years

    I am trying to learn XPath. The theory seems extremely simple, except for the fact that it doesn't work.

    I am trying to get the content of every target element

    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);
    }
    

    The XML doc looks like this:

    <?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>
    

    This is nearly word for word from a tutorial, but I can't get it to work. When the iterator is created, in debug mode, I can see that the document is loaded, but iterator finds no result and skips the While loop.

    I am probably doing something extremely stupid, but what?

    Anyone knows where I can find a good, reliable XPATH tutorial?


    Thanks all. Turns out I ignored the fact that there was a namespace (which I removed while simplifying the XML code as I didn't realize it was important), and with the addition of a namespace manager, the code works fine.

    I am now studying the XPATH tutorials proposed and they look good.

  • Admin
    Admin almost 14 years
    Ja! Ja! We always see answers to technical questions about javascript (and even about CSS) recommending to use a library like JQuery. But I've never seen it recommended as the tutorial!
  • Sylverdrag
    Sylverdrag almost 14 years
    Thanks Martin. You are right, there was a namespace on the original which I removed when "simplifying" the XML file, and of course, now it works.
  • Sylverdrag
    Sylverdrag almost 14 years
    Looks like a great tutorial. Thanks!
  • Admin
    Admin almost 14 years
    @Sylverdrag: And how this answer serves your question title "Good tutorial to learn xpath". I think you should edit that.
  • Sylverdrag
    Sylverdrag almost 14 years
    @Alejandro: It was a 2-in-1 question, and I kind of have to hand it over to the person who manages to spot the underlying problem, although I did upvote the good tutorial answers.