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

C# 使用XmlReader C查看元素的所有文本#,c#,xml,xmlreader,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> 这并没有把所有的内容都告诉我。在这种情况下,如何从节点获取所有内容?使用ReadInnerXml: Str

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

XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <p>Here is some <b>data</b></p>
</data>
这并没有把所有的内容都告诉我。在这种情况下,如何从节点获取所有内容?

使用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());
                }
            }
        }
StringReader myUrl=新的StringReader(@”
这里有一些数据

"); 使用(XmlReader=XmlReader.Create(myUrl)) { while(reader.Read()) { 如果(reader.Name==“p”) { //我想从该节点获取所有文本内容 WriteLine(reader.ReadInnerXml()); } } }
或者,如果您也想跳过
,则可以使用辅助读取器读取子树,并且只读取文本节点:

        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());
StringReader myUrl=新的StringReader(@”
这里有一些数据

"); StringBuilder myVar=新的StringBuilder(); 使用(XmlReader=XmlReader.Create(myUrl)) { while(reader.Read()) { 如果(reader.Name==“p”) { XmlReader pReader=reader.ReadSubtree(); while(pReader.Read()) { if(pReader.NodeType==XmlNodeType.Text) { myVar.Append(pReader.Value); } } } } } Console.WriteLine(myVar.ToString());
我建议您使用一个成熟、稳定的库来完成这类工作。它负责获取html,将其转换为xml,并允许您使用XPATH选择所需的节点

在您的情况下,它将与执行一样简单

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

我无法对其他人的回答进行投票或评论,所以让我说,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;
    }
}
我正在阅读的文件可以在这里找到:
(必须添加DD.MM.YYYY格式的日期才能获取.XML)

示例XML无效。HTML编码是否正确?我的印象是XML不应该在包含节点的元素中包含文本。它应该是一个属性,或者作为无子节点的内部文本。@Tejs可以,但这是完全合法的。@Tejs它是合法的。它在XML中称为“混合内容”。
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;
    }
}