2013-08-29 49 views
0

得到根標籤的所有不同的元素標籤我有一個下面的XML文件如何使用XPath

<root> 
    <element1> 
    <header>header1</header> 
    <tag1>tag1</tag1> 
    <response> 
     <status>success</status> 
     <Data> 
     <id>d1</id> 
     <test>2</test> 
     </Data> 
     <Beta> 
     <betaid>sdsd</betaid> 
     <code>123</code> 
     <code>ddd</code> 
     </Beta> 
    </response> 
    </element1> 
</root> 

我的問題:如何獲得下「響應」標籤中的第一子元素?即staus,數據和測試版。 在C#中使用XPath。謝謝

我有.net代碼在這裏,但它不起作用。

XPathDocument doc= new XPathDocument(XmlReaderdata); 
XPathNavigator mes, Nav = doc.CreateNavigator(); 

foreach(XPathNavigator node in (XPathNodeIterator)Nav.Evaluate("//response/*) 
{ 
      node.Name; 
} 

回答

0

XPath查詢像這應該工作:

//response/* 

例如:

var xml = @"<root> ... </root>"; 
using (StringReader stream = new StringReader(xml)) 
{ 
    XPathDocument doc= new XPathDocument(stream); 
    XPathNavigator nav = doc.CreateNavigator(); 
    XPathNodeIterator itor = (XPathNodeIterator)nav.Evaluate("//response/*"); 

    foreach(XPathNavigator node in itor) 
    { 
     Console.WriteLine(node.Name); 
    } 
} 

產生輸出:

status 
Data 
Beta 
+0

謝謝。我試過,但這不起作用。這裏是我的代碼 – hss

+0

@hss我提供了一個工作代碼的例子。看到我更新的答案。 –

0

您可以使用//response

DTO:

public class Response 
{ 
    public Response() 
    { 
     Data = new List<KeyValuePair<string, string>>(); 
     Beta = new List<KeyValuePair<string, string>>(); 
    } 

    public string Status { get; set; } 
    public List<KeyValuePair<string, string>> Data { get; set; } 
    public List<KeyValuePair<string, string>> Beta { get; set; } 
} 

代碼:

var document = XDocument.Parse(data); 

var element = document.XPathSelectElement("//response"); 

var response = new Response(); 
response.Status = element.Element("status").Value; 

foreach(var dataElement in element.Element("Data").Elements()) 
{ 
    response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value)); 
} 

foreach(var betaElement in element.Element("Beta").Elements()) 
{ 
    response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value)); 
} 

編輯:部分裝載

public Response ParseResponse(XPathDocument document) 
{ 
    var navigator = document.CreateNavigator(); 
    var iterator = navigator.Select("//response"); 
    iterator.MoveNext(); 
    var responseDoc = XDocument.Parse(iterator.Current.OuterXml); 

    var element = responseDoc.Element("response"); 

    var response = new Response(); 
    response.Status = element.Element("status").Value; 

    foreach(var dataElement in element.Element("Data").Elements()) 
    { 
     response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value)); 
    } 

    foreach(var betaElement in element.Element("Beta").Elements()) 
    { 
     response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value)); 
    } 

    return response; 
} 

Response response; 

using(var reader = XmlReader.Create(stream)) 
{ 
    var doc = new XPathDocument(reader); 
    response = ParseResponse(doc); 
} 
+0

謝謝。這是LinqTOXML。他們是用XPathDocument做到這一點的一種方式嗎?由於我的文件相當大,我不想將整個xml數據加載到內存中。 – hss

+0

添加了一些代碼來加載正在流式傳輸的文檔的一部分。 – Romoku

0

你試圖讓孩子節點的名稱? 我希望這會有所幫助

string xmlstring = "<root><element><response><status>Success</status><Data><id>1</id></Data></response></element></root>"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xmlstring); 
     XmlNode node = doc.SelectSingleNode("/root/element/response"); 
     XmlNodeList children = node.ChildNodes; 

     foreach(XmlNode i in children) 
     Console.WriteLine(i.Name);