Dante
Dante

Reputation: 3891

Linq-to-XML not getting content of a node that contains html tags

I have an XML file that I'm trying to parse with Linq-to-XML. One of the nodes contains a bit of HTML, that I cannot retrieve.

The XML resembles:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<image><img src="/Images/m1cznk4a6fh7.jpg"  /></image>
<contentType>Banner</contentType>
</root>

The code is:

XDocument document = XDocument.Parse(content.XML);
XElement imageElement = document.Descendants("image").SingleOrDefault();
image = imageElement.Value; // Doesn't get the content, while if I specify .Descendants("contentType") it works

Any ideas?

Upvotes: 2

Views: 624

Answers (3)

James
James

Reputation: 82136

That is because there is no Value nested under Image only another element (img). You would need to do something like:

XElement imgElement = document.Descendants("image").SingleOrDefault().FirstNode;

Then access the Value property to get src. Otherwise, if you are looking for the img tag as plain text you would need to save it in your XML doc as a CDATA section e..g

<image><![CDATA[<img src="/Images/m1cznk4a6fh7.jpg" />]]></image>

Upvotes: 0

Todd Main
Todd Main

Reputation: 29155

.Value means any text within a tag and any child tags, but you don't have any. When you parsed it, <img/> was viewed as an XML tag, not specific for HTML (Linq doesn't know the difference). For example, if you had your XML written as:

<image>
    <img>/Images/m1cznk4a6fh7.jpg
    </img>
</image>

Then your code would work.

You'll have to go further in your decendents to the <img/> tag and then get the .Value of attribute src to retrieve the text you need.

Upvotes: 1

Nathan Taylor
Nathan Taylor

Reputation: 24606

If you're going to be storing HTML inside the XML elements it should be inside a <![CDATA[]]> comment so that LINQ2XML knows not to treat it as additional XML markup.

<image><![CDATA[<img src="Images/abc.jpg />]]></image>

If memory serves, you shouldn't have to do anything special to extract the value without the CDATA comment wrapping it, but you may need to call a property other than Value. I don't quite recall.

Upvotes: 1

Related Questions