delphi - 如何使用 MSXML6 解析 DTD 节点结构
问题描述
我想在我的 Delphi 应用程序中使用 MSXML6 解析一些独立的 DTD 文件。DTD 文件内容类似于:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ATTLIST to
type CDATA #FIXED "email"
default CDATA #FIXED "you@foo.bar"
>
<!ELEMENT from (#PCDATA)>
<!ATTLIST from
type CDATA #FIXED "email"
default CDATA #FIXED "me@foo.bar"
>
<!ELEMENT heading (#PCDATA)>
<!ATTLIST heading
type CDATA #FIXED "string"
>
<!ELEMENT body (#PCDATA)>
<!ATTLIST body
type CDATA #FIXED "string"
>
尝试使用 MSXML 加载此数据失败,并显示错误消息“不能在 DTD 之外有 DTD 声明”。
将 DTD 包装到一些 DOCTYPE 元素中时,如下所示:
<?xml version="1.0"?>
<!DOCTYPE note [
... content of DTD file above ...
]>
<note/>
解析器成功,但不允许迭代 DTD 结构。加载和显示文档的 (Delphi) 代码如下所示:
var
XmlDoc : iXmlDomDocument2;
i : integer;
begin
XmlDoc := CoDomDocument60.Create();
XmlDoc.SetProperty('NewParser', FALSE);
XmlDoc.SetProperty('ProhibitDTD', FALSE);
XmlDoc.Async := FALSE;
XmlDoc.ValidateOnParse := FALSE;
XmlDoc.Load(FileName);
if ( XmlDoc.ParseError.ErrorCode <> 0 ) then
raise Exception.Create(XmlDoc.ParseError.Reason);
// This will display "note"
ShowMessage('DocType: ' + XmlDoc.Doctype.Name);
// This will display the embedded DTD as a string
ShowMessage('DTD: ' + XmlDoc.Doctype.Xml);
// These loops will display nothing
for i := 0 to XmlDoc.Doctype.Entities.Length-1 do
ShowMessage('Entity: ' + XmlDoc.Doctype.Entities[i].NodeName);
for i := 0 to XmlDoc.Doctype.Notations.Length-1 do
ShowMessage('Notation: ' + XmlDoc.Doctype.Notations[i].NodeName);
for i := 0 to XmlDoc.Doctype.ChildNodes.Length-1 do
ShowMessage('Child: ' + XmlDoc.Doctype.ChildNodes[i].NodeName);
end;
有没有办法使用 MSXML6 迭代 DTD 节点结构?
解决方案
推荐阅读
- python - 通过在列表前面添加反斜杠来转义列表中的保留字符
- reactjs - 在 React Native 中进入屏幕时如何每 3 次显示一次广告?
- android - 如何在我运行颤振项目时修复“错误完成:Gradle 任务 assembleDebug 失败,退出代码 -1”错误
- java - 从消费者端创建主题
- javascript - 如何使用 javascript 显示/隐藏边框
- c# - Unity 3D (C#),我的鼠标检测偏移但我不知道为什么
- curl - curl POST cmd 可以在 xray 中发布到执行证据,但不适用于 python requests.post
- php - 如何在聊天中获得所需的详细信息?
- c++ - 使 const 正确 Vulkan CreateDebugMessenger 函数时出错
- azure - 查找 idyunnoo.f2h 文件夹的 Azure Web 作业代码