Получение определенного узла с использованием DataSet - PullRequest
0 голосов
/ 29 марта 2010

У меня есть следующий 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>

Есть ли способ получить содержимое "xTexto" внутри ObsCont, которое имеет значение "field2" для атрибута xCampo, используя DataSet?

Было бы желательно иметь один лайнер, подобный следующему:

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

Если я использую тот же метод, я не указываю, что мне нужен метод с нужным атрибутом.

Ответы [ 3 ]

1 голос
/ 29 марта 2010

Если у вас есть абсолютно известный путь к данным, вы можете использовать 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 голос
/ 29 марта 2010

Вы, безусловно, могли бы использовать что-то вроде 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);
0 голосов
/ 29 марта 2010

Вот версия решения 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...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...