2009-01-19 103 views
5

我有一個xml文件,我使用LINQ to XML來提取html。這是文件的一個示例:使用LINQ將XML保存爲XML使用LINQ to XML

<?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> 

我使用下面的查詢以提取從文件A「末端」:

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而不是Value,但似乎並不存在。

任何想法?

感謝所有提前,

戴夫

回答

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

嘿內容,抓拍的編輯。對XML進行編碼對於這種情況來說很常見和方便;另一種方法是使用有效的XHTML,將XHTML xmlns聲明爲默認值,並將提示/提示元素放在不同的名稱空間中,以避免混淆這兩者。 – bobince 2009-01-19 15:55:12

0

TipText = t.Value,

XElement.value僅返回是直接在元件內部的文本。嵌套元素中的文本(HTML或其他)不會被包括在內,當然任何實體引用都會以其解碼的形式出現。

如果您想將內容作爲帶有標記的字符串,可以使用SaveOptions.DisableFormatting調用XElement.ToString()。但請注意,這包括包裝< tip>元素 - 也就是說,在Web瀏覽器DOM術語中,它是outerHTML而不是innerHTML。爲了獲得innerHTML,您必須將小孩XElement.Nodes的所有ToString()連接在一起。

1

只需使用string.Concat(tip.Nodes())獲得HTML標記