2009-09-11 79 views
3

我使用Delphi 2006數據綁定向導來爲XML配置文件創建一個接口。後來我意識到XML的某些重複部分可以從主文件中分離出來並在需要時引用。生成的XML看起來是這樣的:解析Delphi中的XML引用

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE module [ 
<!ENTITY Schema65 SYSTEM "schemas/65.xml"> 
]> 
<module> 
    <schema>&Schema65;</schema> 
</module> 

如果我使用Internet Explorer打開佔位符的內容,這個文件「&Schema65;」被正確替換爲外部文件的內容。然而,Delphi解析器似乎沒有認識到這個特性,並且不能代替文本。任何想法如何解決這個問題?

+0

您正在使用哪個解析器。 'TXmlDocument'支持許多不同的解析器。 – 2009-09-11 16:06:35

+0

我假設是默認的。 – Tihauan 2009-09-11 17:34:07

回答

2

Internet Explorer肯定使用MSXML庫。將TXmlDocument.DomVendor屬性設置爲MSXML_DOM(在msxmldom單元中找到),並且您應該得到相同的行爲。您還可以將DefaultDOMVendor全局變量更改爲SMSXML以使所有新的TXmlDocument對象都使用該供應商。

+0

感謝Rob,你的回答很有幫助,但它不能解決我的問題。我希望獲得與使用MSXML_DOM的Internet Explorer相同的結果,但事實並非如此。解析器仍然不包含引用的文件。我嘗試了Delphi中可用的其他解析器,但沒有成功。 – Tihauan 2009-09-12 17:54:01

1

你已經試過OmniXML?我一直在使用它多年,它始終解決了我關於XML文件的問題。如果你還沒有,我建議你嘗試一下:它使用簡單,輕便且免費。

1

Internet Explorer使用XmlResolver XmlDocument的XmlResolver屬性由XmlDocument類用於查找XML數據中不內聯的資源,例如外部文檔類型定義(DTD),實體和模式。這些項目可以位於網絡或本地驅動器上,並且可以通過統一資源標識符(URI)進行識別。這允許XmlDocument解析文檔中存在的EntityReference節點,並根據外部DTD或模式驗證文檔。

你應該使用一個delphi庫來實現一個解析器和解析器到外部資源。

Open XML實現使用TStandardResourceResolver

再見解析器。

+1

默認的解析器有一個名爲「ParseOptions」的屬性,並將其設置爲「poResolveExternals」使其查找外部引用(如果找不到文件,則出現錯誤)。但佔位符不會被外部內容替換。任何關於如何讓解析器也可以替換內容的想法?我認爲這將解決我的問題。 – Tihauan 2009-09-28 09:17:33

+0

嗨Tihauan,請發佈您的代碼來幫助你。 – RRUZ 2009-09-28 16:02:29

1

以下解決了我的問題。似乎Delphi默認解析器(MSXML)實際上包含外部實體引用,但以某種奇怪的方式。在這個例子中

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE module [ 
<!ENTITY Schema65 SYSTEM "schemas/65.xml"> 
]> 
<module> 
    <schema>&Schema65;</schema> 
</module> 

我認爲創建一個TXMLDocument的和外部文件中包含一個簡單的文本,我能得到的文件的內容是這樣的:

MyXML := TXMLDOcument.Create(myfile.xml); 
ExternalText := MyXML.documentElement.ChildNodes['schema'].Text; 

這實際上工作,如果實體引用被簡單的文字取代。但是,在使用外部實體的情況下,Delphi將在「模式」節點內創建一個類型爲「ntEntityRef」的新子。這個節點也有一個最終包含我期望的簡單文本的孩子。該文本可以訪問這樣的:

MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text; 

在殼體外部實體文件包含的節點結構,相應的節點將實體引用節點內被創建。確保TXMLDocument.ParseOptions至少設置爲[poResolveExternals]以實現此目的。這種方法也使得修改由XML數據綁定向導生成的代碼來處理外部實體變得相對容易。