2016-11-24 78 views
-3

我想讀取XML中的特定節點,就好像任何「Log」(根節點)節點包含「Message」節點,它應該讀取「Log」節點下的所有節點。使用條件c讀取特定的xml節點#

注意:日誌節點是根節點,「log」節點下有許多節點。

例如:

<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

該代碼將讀取其中至少有一個消息節點的所有日誌節點。除了我已經檢查了我的結束,代碼是讀取每個日誌節點內的所有消息節點 –

+0

好吧,那麼你將如何打印LOG節點的所有d子節點在循環?這裏我使用字符串n1 = node [「Status」]。InnerText;在第二個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