我使用Delphi 2006数据绑定向导为XML配置文件创建接口。后来我意识到XML的一些重复部分可以与主文件分开并在需要时引用。生成的XML看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
<schema>&Schema65;</schema>
</module>
如果我使用Internet Explorer打开此文件,占位符“&amp; Schema65;”的内容正确替换为外部文件的内容。但是,Delphi解析器似乎无法识别此功能,也不会替换文本。知道如何解决这个问题吗?
答案 0 :(得分:2)
Internet Explorer肯定会使用MSXML库。将TXmlDocument.DomVendor
属性设置为MSXML_DOM
(在msxmldom
单元中找到),您应该得到相同的行为。您还可以将DefaultDOMVendor
全局变量更改为SMSXML
,以使所有新TXmlDocument
个对象都使用该供应商。
答案 1 :(得分:1)
您是否已尝试OmniXML?我已经使用它多年了,它总能解决我关于XML文件的问题。如果你还没有,我建议你试一试:它使用简单,轻便且免费。
答案 2 :(得分:1)
Internet Explorer使用XmlResolver,XmlDocument类的XmlResolver属性由XmlDocument类用于查找XML数据中不内联的资源,例如外部文档类型定义(DTD),实体和模式。这些项目可以位于网络上或本地驱动器上,并且可以通过统一资源标识符(URI)识别。这允许XmlDocument解析文档中存在的EntityReference节点,并根据外部DTD或模式验证文档。
你应该使用delphi库来实现对外部资源的解析器和解析器。
Open XML使用TStandardResourceResolver
实现解析器再见。
答案 3 :(得分: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将在“schema”节点内创建一个类型为“ntEntityRef”的新子节点。该节点还将有一个子节点,它最终包含我期望的简单文本。文本可以像这样访问:
MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;
如果外部实体文件包含节点结构,则将在实体引用节点内创建相应的节点。确保将TXMLDocument.ParseOptions设置为至少[poResolveExternals]以使其发生。这种方法还可以相对容易地调整XML数据绑定向导生成的代码以使用外部实体。