2010-03-29 19 views
0

某個節點,我有以下XML獲得使用DataSet中

<xml> 
    <ObsCont xCampo="field1"> 
     <xTexto>example1</xTexto> 
    </ObsCont> 
    <ObsCont xCampo="field2"> 
     <xTexto>example2</xTexto> 
    </ObsCont> 
    <ObsCont xCampo="field3"> 
     <xTexto>example3</xTexto> 
    </ObsCont> 
<field>information</field> 
</xml> 

有沒有辦法讓「xTexto」的有使用DataSet中的屬性xCampo「域2」值ObsCont裏面的內容?

這將是desireable有一個單一的襯墊類似如下:

DataSet ds = new DataSet(); 
ds.ReadXml(StrArquivoProc); 
ds.Tables["xml"].Rows[0]["field"].ToString(); 
//field == "information" 

如果我使用我不指定我想要的一個具有所需屬性的方法相同。

回答

1

如果你有一個絕對的已知數據路徑,那麼你可以使用XPath:

Dim myFile = "c:\test.xml" 
    Dim X As New System.Xml.XmlDocument() 
    X.Load(myFile) 
    Dim N = X.SelectSingleNode("//xml/ObsCont[@xCampo=""field2""]/xTexto") 
    Trace.WriteLine(N.InnerText) 
+0

+1使用XML工具來處理XML,但如果它的閱讀只有使用XPathDocument和XPathNavigator才能獲得更好的性能。語法相似。 – 2010-03-29 17:14:42

1

你當然可以使用像Linq這樣的XML來將整個文檔加載到一個集合中,你可以進一步查詢或迭代使用它來使用你想要的任何結果,包括綁定到數據控件。或者,您可以直接查詢文檔以獲取所需的屬性/元素值組合,如下所示。

XDocument document = XDocument.Parse(xml); 
// or document = XDocument.Load(xmlFile) 
// System.Xml.Linq namespace 

var query = (from obscont in document.Descendants("ObsCont") 
      where obscont.Attribute("xCampo").Value == "field2" 
      select obscont.Element("xTexto").Value).First(); 

Console.WriteLine(query); 
+0

謝謝你,但我使用.NET 2.0,那我也沒LINQ =(有沒有辦法做到這一點與數據集? – Marcelo 2010-03-29 14:00:49

0

這裏是克里斯哈斯解決方案XPathDocument的版本,它的價值。

Dim myFile = "c:\test.xml" 
Dim fs As New FileStream(myFile, FileMode.Open) 
Dim doc As New XPathDocument(fs) 
fs.Dispose() 
Dim nav = doc.CreateNavigator() 
Dim node = nav.SelectSingleNode("//xml/ObsCont[@xCampo=""field2""]/xTexto") 
Trace.WriteLine(node.Value) 

或者,如果您在字符串中有XML,請改爲使用StringReader。

Dim doc As New XPathDocument(New StringReader(myXml)) 
'And so forth...'