2016-11-24 14 views
-3

"Log"(ルートノード)ノードに "Log"ノードの下にあるすべてのノードを読み取る必要がある "Message"ノードが含まれているかのように、XMLで特定のノードを読み取る。条件を使用して特定のXMLノードを読むC#

注:ログノードはルートノードであり、「ログ」ノードの下に多数のノードがあります。例のため

<TestLogDataSet> 

    <Log> 
    <Assembly>TestCase</Assembly> 
    <TestMethod>Application</TestMethod> 
    <Status>Passed</Status> 
    <Trace /> 
    </Log> 


    <Log> 
    <Assembly>TestCase</Assembly> 
    <TestMethod>Application</TestMethod> 
    <Status>Failed</Status> 
    <Message> 
    <pre><![CDATA[ Error while deleting the Project]]> 
</pre> 
    </Message> 
    <Trace /> 

    </Log> 

</TestLogDataSet> 

コード:

string xmlFile = File.ReadAllText(@"D:\demo.xml"); 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xmlFile); 
foreach (XmlNode lognode in xmlDoc.SelectNodes("/TestLogDataSet/Log[Message]")) 
{ 
    foreach (XmlNode node in lognode.ChildNodes) 
    { 
     string n1 = node.InnerText; 
     textBox1.Text = n1 + "\r\n"; 
    } 
} 
+0

あなたのコードサンプルが完全ではありません。 –

+0

何が欠けていますか? – New

答えて

1

あなたはこのためにXPathを使用することができます。

StringBuilder nodeText = new StringBuilder(); 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(<your xml here>); 
foreach (XmlNode lognode in xmlDoc.SelectNodes("/TestLogDataSet/Log[Message]")) //select all log nodes with Message as child tag 
{ 
    string status = lognode.SelectSingleNode("./Status").InnerText; 
    if (!string.Equals(status,"failed",StringComparison.OrdinalIgnoreCase)) 
    { 
     continue; 
    } 
    foreach (XmlNode node in lognode.ChildNodes) 
    { 
     nodeText.Append(node.LocalName); 
     nodeText.Append(":"); 
     nodeText.Append(node.InnerText);//read inner text of node here 
     nodeText.Append("\n"); 
    } 
} 
Console.WriteLine(nodeText.ToString()); 
+0

xmlに複数のMessagesノードがある場合は、XMLの最後のノードのみを使用しています。 – New

+0

このコードは、内部に少なくとも1つのメッセージノードを持つすべてのログノードを読み取ります。私は私の最後にチェックしているだけでなく、コードは、ログノードの各ノード内のすべてのメッセージノードを読み取っています –

+0

あなたはどのようにループ内のLOGノードのすべてのdの子ノードを印刷するのですか?ここでは、文字列n1 = node ["Status"]を使用しています。 2番目のforeachループではエラーメッセージが表示されます。 – New

0

あなたがLogノードをしたい場合は、これは十分です:

var nodes = 
    xd 
     .Root 
     .Elements("Log") 
     .Where(x => x.Element("Message") != null); 

います:

nodes #1

を使用すると、子ノードのすべてのリストが必要な場合は、(その私はあなたがあなたの質問から欲しいと思っているものですが、それはちょっと奇妙に思われます)この作品:

var nodes = 
    xd 
     .Root 
     .Elements("Log") 
     .Where(x => x.Element("Message") != null) 
     .SelectMany(x => x.Elements()); 

これは与える:

nodes #2

関連する問題