使用LINQ to XML将HTML标记保存在XML中

时间:2009-01-19 15:27:56

标签: xml linq linq-to-xml

我有一个xml文件,我使用LINQ to XML从中提取html。这是文件的一个示例:

<?xml version="1.0" encoding="utf-8" ?>
<tips>
    <tip id="0">
    This is the first tip.
</tip>
<tip id="1">
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content.
</tip>
<tip id="2">
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages.
</tip>
<tip id="3">
    Invite your <b>colleagues</b> to the site by entering their email addresses.  You can then share the content with them!
</tip>
</tips>

我使用以下查询从文件中提取“提示”:

Tip tip = (from t in tipsXml.Descendants("tip")
                   where t.Attribute("id").Value == nextTipId.ToString()
                   select new Tip()
                   {
                     TipText= t.Value,
                     TipId = nextTipId
                   }).First();

我遇到的问题是Html元素被剥离了。我希望使用像InnerHtml这样的东西代替Value,但这似乎并不存在。

有什么想法吗?

提前全部谢谢,

戴夫

4 个答案:

答案 0 :(得分:8)

致电t.ToString()而非Value。这将把XML作为字符串返回。您可能希望使用带有SaveOptions的重载来禁用格式化。我现在无法检查,但我怀疑它将包含元素标记(和元素),因此您需要将其删除。

请注意,如果您的HTML不是有效的XML,则最终会得到一个无效的整体XML文件。

XML文件的格式是否完全超出您的控制范围?对任何HTML内部进行XML编码都会更好。

编辑:避免获取外部部分的一种方法可能是做这样的事情(当然是从查询中调用的单独方法):

StringBuilder builder = new StringBuilder();
foreach (XNode node in element.Nodes())
{
    builder.Append(node.ToString());
}

通过这种方式,您将获得带有后代和散布文本节点的HTML元素。基本上它相当于InnerXml,我强烈怀疑。

答案 1 :(得分:1)

只需使用string.Concat(tip.Nodes())即可获取带有html代码的内容

答案 2 :(得分:0)

  

TipText = t.Value,

XElement.value仅返回元素内部的文本。嵌套元素中的文本 - HTML或其他 - 将不包括在内,当然任何&amp; -entity-references都将以其解码形式出现。

如果您希望将内容作为带有标记的字符串,则可以使用SaveOptions.DisableFormatting调用XElement.ToString()。但请注意,这包括包装&lt;尖端&GT;元素 - 也就是说,在Web浏览器DOM术语中,它是outerHTML而不是innerHTML。要获取innerHTML,您必须将子XElement.Nodes的所有ToString()连接在一起。

答案 3 :(得分:0)

只需使用:

string.Concat(element.Nodes()) 

使用 HTML 标签获取内容。