Pergunta

Just getting started here with my first take at XPathNavigator.

This is my simple xml:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<theroot>
    <thisnode>
        <thiselement visible="true" dosomething="false"/>
        <another closed node />
    </thisnode>

</theroot>

Now, I am using the CommonLibrary.NET library to help me a little:

    public static XmlDocument theXML = XmlUtils.LoadXMLFromFile(PathToXMLFile);

    const string thexpath = "/theroot/thisnode";

    public static void test() {
        XPathNavigator xpn = theXML.CreateNavigator();
        xpn.Select(thexpath);
        string thisstring = xpn.GetAttribute("visible","");
        System.Windows.Forms.MessageBox.Show(thisstring);
    }

Problem is that it can't find the attribute. I've looked through the documentation at MSDN for this, but can't make much sense of what's happening.

Foi útil?

Solução

Two problems here are:

(1) Your path is selecting the thisnode element, but the thiselement element is the one with the attributes and
(2) .Select() does not change the location of the XPathNavigator. It returns an XPathNodeIterator with the matches.

Try this:

public static XmlDocument theXML = XmlUtils.LoadXMLFromFile(PathToXMLFile);

const string thexpath = "/theroot/thisnode/thiselement";

public static void test() {
    XPathNavigator xpn = theXML.CreateNavigator();
    XPathNavigator thisEl = xpn.SelectSingleNode(thexpath);
    string thisstring = xpn.GetAttribute("visible","");
    System.Windows.Forms.MessageBox.Show(thisstring);
}

Outras dicas

You can select a attribute on an element using xpath like this (An alternative to the accepted answer above):

public static XmlDocument theXML = XmlUtils.LoadXMLFromFile(PathToXMLFile);

const string thexpath = "/theroot/thisnode/thiselement/@visible";

public static void test() {
    XPathNavigator xpn = theXML.CreateNavigator();
    XPathNavigator thisAttrib = xpn.SelectSingleNode(thexpath);
    string thisstring = thisAttrib.Value;
    System.Windows.Forms.MessageBox.Show(thisstring);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top