我使用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解析器似乎无法识别此功能,也不会替换文本。知道如何解决这个问题吗?

有帮助吗?

解决方案

Internet Explorer肯定会使用MSXML库。将 TXmlDocument.DomVendor 属性设置为 MSXML_DOM (在 msxmldom 单元中找到),您应该得到相同的行为。您还可以将 DefaultDOMVendor 全局变量更改为 SMSXML ,以使所有新的 TXmlDocument 对象使用该供应商。

其他提示

您是否已尝试 OmniXML ?我已经使用它多年了,它总能解决我关于XML文件的问题。如果你还没有,我建议你试一试:它使用简单,轻便且免费。

Internet Explorer使用 XmlResolver , XmlDocument类的XmlResolver属性由XmlDocument类用于查找XML数据中不内联的资源,例如外部文档类型定义(DTD),实体和模式。这些项目可以位于网络上或本地驱动器上,并且可以通过统一资源标识符(URI)识别。这允许XmlDocument解析文档中存在的EntityReference节点,并根据外部DTD或模式验证文档。

你应该使用delphi库来实现对外部资源的解析器和解析器。

Open XML 使用TStandardResourceResolver实现解析器

再见。

以下为我解决了这个问题。似乎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数据绑定向导生成的代码以使用外部实体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top