代码之家  ›  专栏  ›  技术社区  ›  Tihauan

在Delphi中分析XML引用

  •  3
  • Tihauan  · 技术社区  · 15 年前

    我使用Delphi2006数据绑定向导为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打开此文件,则占位符“&schema65!”的内容将正确替换为外部文件的内容。不过,Delphi解析器似乎无法识别这个特性,也无法替换文本。知道如何解决这个问题吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Rob Kennedy    15 年前

    Internet Explorer肯定在使用MSXML库。设置 TXmlDocument.DomVendor 属性到 MSXML_DOM (在 msxmldom 你应该有同样的行为。您也可以更改 DefaultDOMVendor 全局变量到 SMSXML 使所有新的 TXmlDocument 对象使用该供应商。

        2
  •  1
  •   Prasobh.Kollattu    15 年前

    你已经试过了吗 OmniXML ?我已经使用它很多年了,它总能解决我在XML文件方面的问题。如果你没有,我建议你试一试:它使用简单,轻便,免费。

        3
  •  1
  •   RRUZ    15 年前

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

    您应该使用Delphi库来实现外部资源的解析器和解析器。

    Open XML 使用tsStandardResourceResolver实现解析程序

    再见。

        4
  •  1
  •   Tihauan    15 年前

    下面为我解决了这个问题。看起来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数据绑定向导生成的代码以使用外部实体相对容易。