使用DataSet获取某个节点

时间:2010-03-29 12:48:05

标签: c# .net xml vb.net dataset

我有以下XML

<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>

有没有办法在ObsCont中使用DataSet获取属性xCampo的“field2”值的“xTexto”内容?

如下所示,需要一个单一的衬垫:

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

如果我使用相同的方法,我没有指定我想要具有所需属性的方法。

3 个答案:

答案 0 :(得分:1)

你当然可以使用Linq to 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);

答案 1 :(得分: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)

答案 2 :(得分:0)

以下是Chris Haas解决方案的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...'