使用XmlReader C#查看元素的所有文本

时间:2011-06-02 20:52:07

标签: c# xml xmlreader

我正在使用XmlReader迭代一些XML。一些XML实际上是HTML,我想从节点获取文本内容。

示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <p>Here is some <b>data</b></p>
</data>

示例代码:

using (XmlReader reader = new XmlReader(myUrl))
{
  while (reader.Read()) 
  {
    if (reader.Name == "p")
    { 
      // I want to get all the TEXT contents from the this node
      myVar = reader.Value;
    }
  }
}

这不能得到我所有的内容。在这种情况下,如何从

节点获取所有内容?

3 个答案:

答案 0 :(得分:7)

使用ReadInnerXml:

        StringReader myUrl = new StringReader(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<data>
  <p>Here is some <b>data</b></p>
</data>");
        using (XmlReader reader = XmlReader.Create(myUrl))
        {
            while (reader.Read())
            {
                if (reader.Name == "p")
                {
                    // I want to get all the TEXT contents from the this node
                    Console.WriteLine(reader.ReadInnerXml());
                }
            }
        }

或者,如果您也想跳过<b>,可以使用辅助阅读器作为子树,只读取文本节点:

        StringReader myUrl = new StringReader(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<data>
  <p>Here is some <b>data</b></p>
</data>");
        StringBuilder myVar = new StringBuilder();
        using (XmlReader reader = XmlReader.Create(myUrl))
        {
            while (reader.Read())
            {
                if (reader.Name == "p")
                {
                    XmlReader pReader = reader.ReadSubtree();
                    while (pReader.Read())
                    {
                        if (pReader.NodeType == XmlNodeType.Text)
                        {
                            myVar.Append(pReader.Value);
                        }
                    }
                }
            }
        }

        Console.WriteLine(myVar.ToString());

答案 1 :(得分:1)

我无法对其他人进行投票或评论。回答,所以我只想说 carlosfigueira 击中头部的钉子,这就是你如何读取元素的文本值。他的回答极大地帮助了我。

为了解释这里我的代码:

while (reader.Read())
{
   switch (reader.NodeType)
   {
       case XmlNodeType.Element:
       {
           if (reader.Name == "CharCode")
           {
               switch (reader.ReadInnerXml())
               {
                   case "EUR":
                   {
                        reader.ReadToNextSibling("Value");
                        label4.Text = reader.ReadInnerXml();
                   }
                   break;
                   case "USD":
                   {
                        reader.ReadToNextSibling("Value");
                        label3.Text = reader.ReadInnerXml();
                   }
                   break;
                   case "RUB":
                   {
                        reader.ReadToNextSibling("Value");
                        label5.Text = reader.ReadInnerXml();
                   }
                   break;
                   case "RON":
                   {
                        reader.ReadToNextSibling("Value");
                        label6.Text = reader.ReadInnerXml();
                   }
                   break;
               }
           }
        }
        break;
    }
}

我可以在此处找到我正在阅读的文件:http://www.bnm.md/md/official_exchange_rates?get_xml=1&date= (您必须以DD.MM.YYYY格式添加日期才能获得.XML)

答案 2 :(得分:0)

我建议您使用HtmlAgilityPack这是一个成熟且稳定的库来执行此类操作。它负责获取html,将其转换为xml,并允许您使用XPATH选择您喜欢的节点。

在你的情况下,它就像执行

一样简单
        HtmlDocument doc = new HtmlWeb().Load(myUrl);
        string text = doc.DocumentNode.SelectSingleNode("/data/p").InnerText;