Frage

I have an XMLDocument as result of query.

I would like to extract the <Property> value and the appropriate <Notes> for each entry.

<?xml version="1.0"?>
<EADATA version="1.0" exporter="Enterprise Architect">
<Dataset_0>
    <Data>
      <Row>
        <PropertyID>439</PropertyID>
        <Object_ID>683</Object_ID>
        <Property>tagged value</Property>
        <ea_guid>{5BF3E019-277B-45c2-B2DE-1887A90C6944}</ea_guid>
      </Row>


      <Row> 
        <PropertyID>444</PropertyID>
        <Object_ID>683</Object_ID>
        <Property>Another Tagged value</Property>
        <Notes>Another tagged value notes.</Notes>
        <ea_guid>{42BE8BAA-06B8-4822-B79A-59F653C44453}</ea_guid>
      </Row>
    </Data>
  </Dataset_0>
</EADATA>  

However, If the <Notes> is empty there is no <Notes> tag at all.

What XPath should I write in such cases?

War es hilfreich?

Lösung

Which value do you want if there is no Notes element, a null, an empty string?

I would select the Row elements with SelectNodes and then check whether a Notes child exists and assign null (as done below) or the empty string if not:

foreach (XmlElement row in doc.SelectNodes("//Row"))
{
  string prop = row.SelectSingleNode("Property").InnerText;
  string notes = row.SelectSingleNode("Notes") != null ? row.SelectSingleNode("Notes").InnerText : null;
}

Andere Tipps

Try this :

XPathDocument docNav = new XPathDocument(new StringReader(xml));
XPathNavigator navigator = docNav.CreateNavigator();
XPathNodeIterator NodeIter = navigator.Select("/EADATA/Dataset_0/Data/Row"); 

foreach (XPathNavigator selectedNode in NodeIter) 
{
    var a=  "<root>" +  selectedNode.InnerXml + "</root>";
    var x= XDocument.Parse(a);
    Console.WriteLine (x.Root.Element("Property").Value); 
    if (x.Root.Element("Notes")!=null)
    Console.WriteLine (x.Root.Element("Notes").Value); 

}

result :

tagged value
Another Tagged value
Another tagged value notes.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top