Могу ли я получить конкретный пример XML в c # - PullRequest
5 голосов
/ 26 апреля 2011

Я пытаюсь извлечь несколько элементов из документов XML и их дочерних элементов, но нигде не могу найти полезного примера ... MSDN очень расплывчатый. Это c # в .Net

Я уже создаю этот XML-файл динамически и переношу его в строку. Я пытался использовать XmlNode с NodeList для просмотра каждого файла в разделе foreach, но он не работает должным образом.

Вот пример XML:

<searchdoc>
    <results>
        <result no = "1">
            <url>a.com</url>
            <lastmodified>1/1/1</lastmodified>
            <description>desc1</description>
            <title>title1</title>
        </result>
        <result no = "2">
            <url>b.com</url>
            <lastmodified>2/2/2/</lastmodified>
            <description>desc2</description>
            <title>title2</title>
        </result>
    </results>
</searchdoc>

Мне нужно вытащить каждый из полных путей <result>

Ответы [ 5 ]

5 голосов
/ 26 апреля 2011

Существует несколько способов решения этой проблемы, в зависимости от , с какой версией .NET Framework вы работаете:

.NET 1.x,2.0 и 3.0

Вы можете легко получить отфильтрованный список узлов из вашего XML-документа, выполнив запрос XPath через XPathDocument class :

using (var reader = new StringReader("<Results><Result>...</Result></Results>"))
{
  var document = new XPathDocument(reader);
  var navigator = document.CreateNavigator();
  var results = navigator.Select("//result");

  while (results.MoveNext())
  {
    Console.WriteLine("{0}:{1}", results.Current.Name, results.Current.Value);
  }
}

.NET 3.5и позже

Вы должны использовать LINQ to XML для запроса и фильтрации XML-иерархий, поскольку он предлагает гораздо более выразительный API, чем синтаксис XPath :

var document = XDocument.Parse("<Results><Result>...</Result></Results>");
var results = document.Elements("result");

foreach (var item in results)
{
  Console.WriteLine("{0}:{1}", item.Name, item.Value);
}

Связанные ресурсы:

1 голос
/ 26 апреля 2011

Я создаю этот XML динамически уже и передать его строка. ... мне нужно вытащить каждого из полные пути <result>

Если вам просто нужны сегреализованные <result> элементы XML-документа, , вероятно, самый простой способ сделать это с этим преобразованием XSLT (ознакомьтесь с документацией MSDN, чтобы узнать, как выполнить преобразование XSLT ( метод XslCompiledTransform.Transform () )) в C #:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/*/result"/>
 </xsl:template>
</xsl:stylesheet>

При применении к предоставленному документу XML :

<searchdoc>
    <results>
        <result no = "1">
            <url>a.com</url>
            <lastmodified>1/1/1</lastmodified>
            <description>desc1</description>
            <title>title1</title>
        </result>
        <result no = "2">
            <url>b.com</url>
            <lastmodified>2/2/2/</lastmodified>
            <description>desc2</description>
            <title>title2</title>
        </result>
    </results>
</searchdoc>

желаемый, правильный результат:

<result no="1">
  <url>a.com</url>
  <lastmodified>1/1/1</lastmodified>
  <description>desc1</description>
  <title>title1</title>
</result>
<result no="2">
  <url>b.com</url>
  <lastmodified>2/2/2/</lastmodified>
  <description>desc2</description>
  <title>title2</title>
</result>
1 голос
/ 26 апреля 2011

Вы можете использовать XElement.Parse () (или XDocument.Parse (), но я использую его только тогда, когда у вас есть правильный XML-документ)

string doc = @"<searchdoc>
<results>
<result no = '1'>
<url>a.com</url>
<lastmodified>1/1/1</lastmodified>
<description>desc1</description>
<title>title1</title>
</result>
<result no = '2'>
<url>b.com</url>
<lastmodified>2/2/2/</lastmodified>
<description>desc2</description>
<title>title2</title>
</result>
</results>
</searchdoc>

";
var element = XElement.Parse(doc);
foreach (var result in element.Descendants("result"))
{
   Console.WriteLine(result.Element("url").Value);
}
1 голос
/ 26 апреля 2011

Возможно, вам следует использовать Linq to Xml или XmlDocument API.

С XmlDocument вы можете сделать:

string xml = GetXmlFromFile();
var xDoc = XmlDocument.Load(xml);
var nodes = xDoc.SelectNodes('//result');

или с linq to xml (XDocument api)

string xml = GetXmlFromFile();
var xDoc = XDocument.Load(xml);

var nodes = from x in xDoc.Descendants("result")
            select x;
1 голос
/ 26 апреля 2011

Если ваш документ не слишком большой (я думаю, что это не так, поскольку вы уже генерируете его динамически), не могли бы вы просто использовать LINQ to Xml?

XDocument myDoc = XDocument.Parse(myXmlString);
foreach(var result in myDoc.Descendants("result"))
{
  DoStuffWithTitle(result.Element("Title").Value);
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...