View all element text with XmlReader C #

I am using XmlReader to iterate through some XML. Some of the XML is actually HTML, and I want to get text content from node.

XML example:

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

Code example:

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;
    }
  }
}

This does not give me all the content. How to get all content from

node in this situation?

+3
source share
3 answers

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

Or, if you want to skip <b>, you can also use an aux reader for the subtree and read only text nodes:

        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());
+6
source

, , 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)

+1

I suggest you use HtmlAgilityPack , which is a mature and stable library for this kind of thing. It takes care of extracting html, converting it to xml and allows you to select the nodes you want to use with XPATH.

In your case, it will be as simple as doing

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

All Articles