【问题标题】:Delphi - package, XML parsing and DTDDelphi - 包、XML 解析和 DTD
【发布时间】:2017-07-01 18:57:49
【问题描述】:

我正在使用 RAD Studio XE7。在我正在创建的 Delphi 包中,我需要解析包含以下 SVG 数据的 XML:

<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="141.73px" height="141.73px" viewBox="0 0 141.73 141.73" enable-background="new 0 0 141.73 141.73" xml:space="preserve">
    <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="67.6445" y1="90.6875" x2="99.4551" y2="90.6875">
        <stop  offset="0" style="stop-color:#26B5E3"/>
        <stop  offset="0.4887" style="stop-color:#3FBEED;stop-opacity:0.5113"/>
        <stop  offset="1" style="stop-color:#47C1F1;stop-opacity:0"/>
    </linearGradient>
    <path fill="url(#SVGID_1_)" d="M94.25,82.792l5.205-4.868c-3.235,14.581-16.266,25.527-31.811,25.527v-9.033c10.257,0,19.001-6.592,22.22-15.765L94.25,82.792z"/>
    <path fill="#26B5E3" d="M99.479,63.931C96.303,49.282,83.23,38.279,67.645,38.279c-17.966,0-32.589,14.616-32.589,32.582c0,17.967,14.624,32.59,32.589,32.59v-9.033c-12.99,0-23.557-10.566-23.557-23.557c0-12.982,10.567-23.55,23.557-23.55c10.567,0,19.534,7.004,22.507,16.604l-15.937-0.042l10.017,9.46l5.633,5.32l4.386,4.139l5.205-4.868l4.854-4.549l10.065-9.411L99.479,63.931z"/>
</svg>

在我的包中,我使用以下代码来读取 XML 文档:

uses ..., Xml.XMLIntf, Xml.XMLDoc, Xml.Win.msxmldom, ...

var
    pDocument: IXMLDocument;
    ...
begin
    ...
    // load file
    pDocument := LoadXMLDocument(fileName);
    ...
end;

当 XML 不包含以下行时,此代码运行良好:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

但是在 XML 中的这一行我得到一个错误:“DTD 被禁止”

我知道这个错误是众所周知的,添加以下行应该可以解决问题:

Xml.Win.msxmldom.MSXMLDOMDocumentFactory.AddDOMProperty('ProhibitDTD', False);

情况就是这样:加载 XML 时不再生成错误。但是,我的文档的所有内容似乎都已损坏:某些节点的名称丢失,所有属性内容始终为空,...如果我在包代码中注释 AddDOMProperty('ProhibitDTD', False),则永远不会发生这种奇怪的行为如果我手动删除源 XML 中包含 DTD 的行。此外,即使在使用 AddDOMProperty('ProhibitDTD', False) 代码时,在 exe 而不是包中编译的相同代码也能正常工作。

所以我的问题是:

  1. 我做错了什么?为什么当我在我的包代码中激活 AddDOMProperty('ProhibitDTD', False) 时我的 XML 文档完全损坏?
  2. 对于在包内执行的代码,解决“禁止 DTD”问题的正确方法是什么? (请举例)

问候

【问题讨论】:

  • 预处理 XML 并删除 doctype 并添加有效的 xml prolog?
  • whorsdaddy,谢谢你的回答。我已经考虑过这个选项,但这将是我应用的最少,首先因为我面临的问题可能是更深层次问题的信号,其次因为我认为忽略一个问题是遇到许多其他问题的更好方法我的路。为此,我更愿意在应用解决方法之前了解此处发生的情况。

标签: xml delphi dom package dtd


【解决方案1】:

好的,我找到了问题的根源。事实上,我犯了一个严重的错误。加载 XML 后,我尝试以这种方式获取第一个节点:

pNode := pDocument.ChildNodes['svg'];

取而代之的是:

pNode := pDocument.DocumentElement;

我注意到问题消失了,我的所有节点数据都在正确的位置。

【讨论】:

  • 是的,你是对的,对不起。我错误地认为问题出在加载过程本身,而不是在解析之后。
猜你喜欢
  • 2016-04-23
  • 2014-09-28
  • 2023-03-22
  • 2017-08-19
  • 2015-10-13
  • 1970-01-01
  • 2014-12-26
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多