2016-09-24 3 views
1

Ich muss einen Knotenwert basierend auf den Kriterien erhalten, die ein anderer Knotenwert erfüllt.Auswählen von xml-Knoten und einem Wert seines untergeordneten Knotens basierend auf einigen Kriterien in C#

Dies ist das XML-Beispiel, das ich durch bin auf der Suche:

<Elements> 
<Element> 
    <ElementID>A1</ElementID> 
    <ElementName>Element A</ElementName> 
    <ElementValues> 
     <ElementValue> 
      <ValueText>A Value</ValueText> 
      <ValueDescription>A Type Element</ValueDescription> 
     </ElementValue> 
    </ElementValues> 
</Element> 
<Element> 
    <ElementID>B1</ElementID> 
    <ElementName>Element B</ElementName> 
    <ElementValues> 
     <ElementValue> 
      <ValueText>B Value</ValueText> 
      <ValueDescription>B Type Element</ValueDescription> 
     </ElementValue> 
    </ElementValues> 
</Element> 
</Elements> 

ich einen Tag-Wert aus dem Wertetext-Tag aus dem Knoten mit bestimmten ElementID benötigen. Zum Beispiel: Wenn das Suchkriterium "A1" ist, sollte das Ergebnis "A Value" sein. (etwas wie: erhalten ValueText.Value, wenn ElementID = "A1") Bitte helfen Sie mir mit diesem (Linq, XPath, was auch immer ...), ich bin nur in den Kreisen drehen und nirgends.

Vielen Dank im Voraus!

Ich habe wirklich die Antwort gesucht, konnte aber das ähnliche nicht bekommen ...

Antwort

0

Wenn ich Recht habe, können Sie den Ausdruck XPath verwenden

//Element[ElementID/text() = \"B1\"] 

Es ist für jeden suchen <Element> Knoten im XML-Dokument und wählen Sie diejenigen, die einen <ElementID> Unterknoten haben, der zusätzlich die Eigenschaft text() (der innere Text) hat einen Wert von B1. Sie können die "B1" zu "A1" ändern und Sie werden den anderen Knoten erhalten, seien Sie vorsichtig beim Einfügen von Benutzereingaben, da sie nicht in der Lage sind, Ihren vollständigen XPath-Ausdruck zu ändern, was zu Sicherheitslücken führen kann .

Hier ist ein Beispielprogramm.

public static void Main(string[] args) 
    { 
     string xml = @"<Elements> 
        <Element> 
         <ElementID>A1</ElementID> 
         <ElementName>Element A</ElementName> 
         <ElementValues> 
          <ElementValue> 
           <ValueText>A Value</ValueText> 
           <ValueDescription>A Type Element</ValueDescription> 
          </ElementValue> 
         </ElementValues> 
        </Element> 
        <Element> 
         <ElementID>B1</ElementID> 
         <ElementName>Element B</ElementName> 
         <ElementValues> 
          <ElementValue> 
           <ValueText>B Value</ValueText> 
           <ValueDescription>B Type Element</ValueDescription> 
          </ElementValue> 
         </ElementValues> 
        </Element> 
        </Elements>"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     XmlNode root = doc.DocumentElement; 

     /* Select all "<Element>" nodes which have an <ElementID> subnode where the text equals "B1". */ 
     var nodes = root.SelectNodes("//Element[ElementID/text() = \"B1\"]"); 

     foreach(XmlNode node in nodes){ 
      Console.WriteLine("Found matching Element: \n {0}", node.InnerXml); 
     } 
    }   

Ausgänge

Found matching Element: 
<ElementID>B1</ElementID><ElementName>Element B</ElementName><ElementValues><ElementValue><ValueText>B Value</ValueText><ValueDescription>B Type Element</ValueDescription></ElementValue></ElementValues> 
0

Hier ist eine einfache LINQ-Abfrage:

string xml = ...; 
var root = XElement.Parse(xml); 
string elementID = "A1"; 
var result = root.Elements("Element") 
    .Where(e => e.Element("ElementID").Value == elementID) 
    .Select(e => e.Element("ElementValues").Element("ElementValue").Element("ValueText").Value) 
    .FirstOrDefault(); 
0

Arbeiten mit XML und LINQ to XML bieten einen objektorientierten Ansatz mit XML arbeiten. Wenn das XML zum Beispiel zuerst geparst wird, ist die gesamte XML-Struktur das Objekt, d. H. Das Root. Wenn Knoten ausgewählt werden, wird jeder Knoten zu seinem eigenen Objekt. Von Ihrem Beispiel angenommen, bereits Sie haben die XML ist eine Zeichenfolge (könnte eine Datei oder Strom, was auch immer sein):

var doc = XDocument.Parse(xml); 

// retrieve the parent node of A1 
XElement a1 = doc.Root.Elements("Element") 
         .First(x => x.Element("ElementID").Value == "A1"); 

// a1 now has an XML structure of: 
// <Element> 
// <ElementID>A1</ElementID> 
// <ElementName>Element A</ElementName> 
// <ElementValues> 
//  <ElementValue> 
//  <ValueText>A Value</ValueText> 
//  <ValueDescription>A Type Element</ValueDescription> 
//  </ElementValue> 
// </ElementValues> 
// </Element> 

// get the value of ValueText w/ a verbose path: 
string verbosePath = a1.Element("ElementValues") 
         .Element("ElementValue") 
         .Element("ValueText").Value; 

// alternatively, short-circuit the path: 
string shortPath = a1.Descendants("ValueText").First().Value; 
0

mit LINQ Fertig, ersetzen elementId mit der Element-ID Sie den Wert Text von mögen.

var xDoc = XDocument.Parse(xml); 
var elements = xDoc.Element("Elements"); 
var element = elements.Elements("Element").Single(e => e.Element("ElementID").Value.Equals(elementId)); 
var valueText = element.Descendants("ValueText").Single().Value; 
Verwandte Themen