2010-08-22 44 views
0

我有一個XDocument我在其中添加了一些註釋(.AddAnnotation)。現在我想用這些註釋書寫文檔。 .ToString.WriteTo都將丟棄註釋,因此它們將不起作用。實質上,我需要一個自定義的XML編寫器,但抽象類XmlWriter對元素和屬性的註釋沒有任何概念。具體的問題是,我必須在具有特定註釋的元素之前寫入一些東西,並且使用屬性寫入相同的東西。寫一個帶註釋的XDocument

一個解決方案,我不必寫每一個位(XMLWriter),但只處理我需要的兩種情況(在具有註釋的元素之前以及帶有註釋的屬性之前)。

我的一個部分解決方案是將這個特定的註釋元素包裝在另一個元素中,但是這弄亂了XML並且不能處理屬性。另一種解決方案是用XComment的元素替換元素和屬性之前的註釋。但之後我將不得不更換評論。我可能會用最後一個解決方案,但可能已經有評論,可能會有我應用評論的相同格式。

例子:

var annoAtt = new XAttribute("Name", "Foo"); 
annoAtt.AddAnnotation(new Foo()); 

var doc = new XDocument(
      new XElement("Root", 
       new XElement("Some", 
        annoAtt)))); 

話,我想以此爲輸出(不是有效的XML,但我並不需要一個):

<Root> 
    <Some {Something}Name="Foo"/> 
</Root> 

我能做出這樣的:

<Root> 
    <Some my:Something="Name ..." Name="Foo"/> 
</Root> 

但這真的不是我想要的。

如果我可以得到元素和屬性的起始位置,它將是完美的。我試圖實現與:

http://blogs.msdn.com/b/mikechampion/archive/2006/09/10/748408.aspx

+0

那麼,注射你問如何讓Linq到XML輸出無效的XML? – R0MANARMY 2010-08-22 14:36:29

+0

我稱之爲自定義輸出,但是;-)或給我一個元素或屬性的文本位置。 – 2010-08-22 14:37:42

回答

0

問題解決了:-)

隨着XDocument.Load(reader, LoadOptions.SetLineInfo)我可以得到與線行號和位置:

var info = (IXmlLineInfo)element; 

我需要的東東可以用這些信息

4

鑑於註釋是任意對象,這並不奇怪,他們沒有寫出來。它們不是XML文檔模型的一部分 - 它們只是LINQ to XML的補充。你需要堅持註釋嗎?如果只是字符串數據,你可能想創建一個屬性(可能在你自己的命名空間中,所以很容易避免衝突)。無可否認,如果你想向文本節點添加註釋可能會很棘手,但你可以很容易地將它們添加到元素和屬性。 (有兩種不同的屬性,其中之一指定它適用於哪些屬性作爲其數據的一部分。)

基本上,如果您希望數據在XML表示中保留,它將需要成爲普通XML文檔的一部分模型。

+0

請看我想要的例子。 – 2010-08-22 13:05:03