【问题标题】:View all text of an element with XmlReader C#使用 XmlReader C# 查看元素的所有文本
【发布时间】:2011-09-07 09:28:08
【问题描述】:

我正在使用 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;
    }
  }
}

这并没有让我得到所有的内容。如何从

中获取所有内容

节点在那种情况下?

【问题讨论】:

  • 示例 XML 无效。 HTML 是否正确编码?
  • 我的印象是 XML 不应该在包含节点的元素中包含文本。它应该是一个属性,或者作为一个子节点的内部文本。
  • @Tejs 好的,但这完全合法。
  • @Tejs 是合法的。它在 XML 中称为“混合内容”。 w3schools.com/schema/schema_complex_mixed.asp

标签: c# xml xmlreader


【解决方案1】:

使用 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());
                }
            }
        }

或者如果你也想跳过&lt;b&gt;,你可以对子树使用辅助阅读器,并且只阅读文本节点:

        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());

【讨论】:

    【解决方案2】:

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

    在你的情况下,它就像执行一样简单

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

    【讨论】:

      【解决方案3】:

      我不能投票或评论其他人的回复,所以我只想说 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)

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        相关资源
        最近更新 更多