2013-07-19 62 views
2

我有很多需要解析的長文檔。文檔格式與XML相似,但實際上不是xml。C#如何解析非標準的xml

下面是一個例子:

<DOC> 
    <TEXT>it's the content P&G</TEXT> 
</DOC> 
<DOC> 
    <TEXT>it's antoher</TEXT> 
</DOC> 

注意,有多發性根標籤 - <DOC>,與實體&應爲XML &amp;

因此,上述文件不是標準的xml。

我可以使用XmlDocument解析文件,還是應該編寫自己的解析器?

+1

會用&替換&,並用包裝整個字符串...就夠了嗎?還是有更多? –

+0

由於它不是XML,因此您將無法使用XML解析器。你會想要決定它到底是什麼,然後使用解析器來解決這個問題。 –

+0

我將會殘酷地移除「XML」標籤,因爲這是一個關於如何解析某種非XML的語言的問題。 –

回答

6

你說的有點不正確 - 這是「不標準的XML」。該文檔是而不是 XML。期。

不能使用XmlDocument或任何其他XML解析器來解析它作爲一個完整的文檔。

在嘗試使用XML解析器解析之前,您需要確保擁有有效的XML。

所以 - 在這種情況下,要麼在根元素中彎曲文檔,要麼將其分解爲多個文檔。無論哪種情況,您都需要確保特殊字符編碼正確(引號,&符號等)。

oakio的answer通過將文檔視爲XML片段來幫助您,但這仍然無助於無效內容,例如未轉義的&符號。

1

是的,但你應該設置XmlReaderSettings.ConformanceLevel

XmlReaderSettings settings = new XmlReaderSettings() 
{ 
    ConformanceLevel = ConformanceLevel.Fragment 
}; 
using (XmlReader reader = XmlReader.Create(stream, settings)) 
{ 
    //TODO: read here 
} 

更多:http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.conformancelevel.aspx

+2

這將失敗,未編碼的&&。 – Oded

+0

@Oded http://stackoverflow.com/a/121537/835720 – oakio

+0

當然。但是,這仍然使你的答案不完整... – Oded

2

由於@Oded說,這不是一個XML文檔 - 只是一些文字。

然而,隨着一些預解析你也許可以將它轉換:

裹在一個新的根節點整個事情:

<DOCS> 
    <DOC> 
     <TEXT>it's the content P&G</TEXT> 
    </DOC> 
    <DOC> 
     <TEXT>it's antoher</TEXT> 
    </DOC> 
<DOCS> 

和搜索不允許的字符,並與他們的實體取代(例如&apos;&amp;)。

正如在評論中指出,應更換&第一,以避免雙重編碼(即&apos;amp;結束了)

您可能必須通過字符串操作要做到這一點,雖然,這取決於你在哪裏得到數據來自。

+1

唯一的問題是字符串替換是雙重編碼(特別是當用'&'替換'&'時,這就是爲什麼它應該是_first_替換)。 – Oded