【问题标题】:Getting a certain node using DataSet使用 DataSet 获取某个节点
【发布时间】:2010-03-29 12:48:05
【问题描述】:

我有以下 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"

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • +1 用于使用 XML 工具处理 XML,但如果它是只读的,则使用 XPathDocument 和 XPathNavigator 可能会获得更好的性能。语法类似。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但我使用的是 .net 2.0,然后我没有 LINQ =( 有没有办法用数据集做到这一点?
    【解决方案3】:

    这是 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...'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多