user8980331
user8980331

Reputation: 15

Pasting xml to console

I need to get data SHILS_V from XML file. I read .xml

XML code for example:

<SVED_PR_GS>
          <ZGLV>
            <VERSION>99</VERSION>
            <DATA>9999</DATA>
            <FILENAME>1234</FILENAME>
            <FIRSTNAME>1234</FIRSTNAME>
          </ZGLV>
          <SVD>
            <CODE></CODE>
            <YEAR></YEAR>
            <MONTH></MONTH>
          </SVD>
          <SV_PR_GS>
            <OBSV>
              <N_ZAP>1</N_ZAP>
              <MO_SV_V>12345</MO_SV_V>
              <SNILS_V>123456789</SNILS_V>
            </OBSV>
          </SV_PR_GS>
</SVED_PR_GS> 

My code to read xml:

XmlDocument xml = new XmlDocument();
xml.Load(filename);
Console.WriteLine("this");
XmlNodeList nodes = xml.GetElementsByTagName("SVED_PR_GS/SV_PR_GS");

foreach (XmlNode n in nodes)
{
    Console.WriteLine("in loop");
    XmlNode snils_v = n["OBSV/SNILS_V"];
    Console.WriteLine("Snils V: " + snils_v);
}

Where is the problem? How to get the information from SNILS_V?

Upvotes: 0

Views: 176

Answers (3)

rene
rene

Reputation: 42444

GetElementsByTagName expects a tagname, not an XPath expression, "SV_PR_GS" will work there. And the same goes for the indexer of your XmlNode instance called n, this XPath will not work n["OBSV/SNILS_V"], use a tagname there as well but you have to handle the extra OBSV child there.

Here is your adapted code that produces output for me:

XmlNodeList nodes = xml.GetElementsByTagName("SV_PR_GS");

foreach (XmlNode n in nodes)
{
    Console.WriteLine("in loop");
    // first get the OBSV element
    XmlNode obsv = n["OBSV"];
    // now we can reach the other childs
    XmlNode snils_v = obsv["SNILS_V"];
    // Value will be null for XmlElement types, use InnerText instead
    Console.WriteLine("Snils V: {0}" , snils_v.InnerText);
}

Notice that the Value property will return null for XmlNode that are of type XmlElement. In the XmlNode.Value documentation it is stated:

null. You can use the XmlElement.InnerText or XmlElement.InnerXml properties to access the value of the element node.

As your SNILS_V element seem to contain just a value InnerText is appropriate here.

Upvotes: 1

Kerri Brown
Kerri Brown

Reputation: 1187

You should be able to get the value as follows:

XmlDocument xml = new XmlDocument();
xml.Load(filename);
Console.WriteLine("this");
XmlNodeList nodes = xml.GetElementsByTagName("OBSV");

foreach (XmlNode n in nodes)
{
    Console.WriteLine("in loop");
    XmlNode snils_v = n.SelectSingleNode("SNILS_V");
    Console.WriteLine("Snils V: " + snils_v.InnerText);
}

Upvotes: 0

Harish
Harish

Reputation: 337

To select a single node from XML. You need to access that object using SelectSingleNode method.

xml.SelectSingleNode("xpath for node")

To get collection of nodes you can write

xml.SelectNodes("xpath for node collection")

Upvotes: 0

Related Questions