2016-12-22 3 views
0

ich eine XML-Datei haben wie:prüfen xml Elementwert C#

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Session TimeStamp="2016-12-21T17:01:01.8642453+02:00"> 
    <Message> 
     <Content>test1</Content> 
     <ID>1</ID> 
     <Timestamp>12/21/2016 17:01:01</Timestamp> 
     <EventType>Debug</EventType> 
     <Priority>High</Priority> 
    </Message> 
    <Message> 
     <Content>test2</Content> 
     <ID>2</ID> 
     <Timestamp>12/21/2016 17:01:01</Timestamp> 
     <EventType>Exception</EventType> 
     <Priority>Low</Priority> 
    </Message> 
    <Message> 
     <Content>test3</Content> 
     <ID>3</ID> 
     <Timestamp>12/21/2016 17:01:01</Timestamp> 
     <EventType>Info</EventType> 
     <Priority>Medium</Priority> 
    </Message> 
    <Message> 
     <Content>test4</Content> 
     <ID>4</ID> 
     <Timestamp>12/21/2016 17:01:01</Timestamp> 
     <EventType>Warn</EventType> 
     <Priority>None</Priority> 
    </Message> 
    </Session> 
</Root> 

möchte ich den Wert des Elements Inhalt in jeder Nachricht überprüfen, i mit dieser Methode versuchen haben:

Assert.IsTrue(xDocument.Root.Elements("Session").Last().Elements("Message").First().Element("Content").Value.Contains("test1")); 

Ausnahme: System.InvalidOperationException: Sequenz enthält keine Elemente

Die Methode fehlschlagen, kann den Elementwert nicht finden, wie kann ich es mit xdocument tun?

+0

Ich schlage vor, dass Sie diese lange Anweisung in kürzere aufteilen und sie im Debugger durchlaufen. Auf diese Weise können Sie sehen, welche Anweisung fehlschlägt. Und wenn Sie sich die Variablen ansehen, erhalten Sie einige Hinweise, warum dies fehlschlägt. – wkl

+0

Ihr Code funktioniert, wenn ich versuche, es zu replizieren. Wie analysierst du den Text zum xDocument? Verwenden Sie XDocument.Parse? – PartlyCloudy

Antwort

2

Sind Sie für diese suchen, da Sie

sagen, dass ich den Wert des Elements Inhalt in jeder Nachricht

xDocument.Root.Elements("Session") 
       .Elements("Message") 
       .Elements("Content") 
       .Select(x => x.Value.Contains("test1")); 

Es würde zurückkehren überprüfen möchten, welche Knoten enthält test1 so das Ergebnis wäre true,false,false,false

bearbeiten

nach Ihrem Kommentar „i nur überprüfen will, wenn die Nachricht 1 Inhalt Zeichenfolge‚test1‘

xDocument.Root.Elements("Session") 
       .Elements("Message") 
       .Elements("Content") 
       .FirstOrDefault().Value.Contains("test1"); 
+0

Ich möchte nur überprüfen, ob der Inhalt der Nachricht 1 die Zeichenfolge "test1" enthält –

+0

Werfen Sie einen Blick auf die aktualisierte Antwort. @Landroid –

0
XmlDocument advDoc=new XmlDocument(); 
advDoc.Load("test.xml"); 
XmlNodeList _ngroups = advDoc.GetElementsByTagName("Content"); 
foreach(XmlNode nd in _ngroups) 
{ 
    if(nd.InnerText.ToString()=="test1") 
    Console.WriteLine("true"); 
} 
+0

Code-only Antworten wie diese sind nicht sehr klar. Bitte erläutern Sie, was Ihr Code tut. – thomasb

0

ich nur wollen, wenn Nachricht 1 Inhalt Zeichenfolge enthält, um zu überprüfen "test1"

string pathToXmlFile = ""; // point to your xml file ... 
using (StreamReader reader = File.OpenText(pathToXmlFile)) 
{ 
    XDocument doc = XDocument.Load(reader); // load into XDocument 
    XElement idElement = doc.Root.Element("Session").Elements("Message").Elements("ID").First(item => item.Value == "1"); // since you need the message id = 1 
    string content = idElement.Parent.Element("Content").Value; // get the parent of this message id which is message element then navigate to its content element. 
} 

this helps ..

Verwandte Themen