Matlab 处理 DTD 的工具是不完整的。值得注意的是,如果您使用包含的 DTD 读取 XML 文件xmlread
,然后使用xmlwrite
将其保存回来,则所有 DTD 内容都将被删除(执行实体替换,因此您仍然可以解析和读取新文件没有错误)。仅插入 DTD没有简单且真正健壮的方法——在这种 XML 中,一切都是严格的,在读取和写入文件时应该非常小心。
但是,使用一些旧代码,我已经编写了一个非鲁棒的解决方案,只要您检查输出,它就可以在简单的情况下工作。您可以在此处下载 M 文件和示例 XML 文件。该xmlentity
函数通过读入内容、执行一些粗略的解析并写出新数据,将 DTD 实体添加到 XML 文件中。
我使用了以下'example.xml'
XML 文件(来自此处),经过编辑以包含一些 HTML 实体:
<?xml version="1.0" encoding="utf-8"?>
<AddressBook>
<Entry>
<Name>Frieñdly J. Mathworker</Name>
<PhoneNumber>(508) 647-7000</PhoneNumber>
<Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address>
</Entry>
</AddressBook>
调用xmlread('example.html')
此文件会返回一个错误,就像您看到的那样,因为它不是有效的 XML。为了解决这个问题,定义了使用的两个实体(可以在此处找到其他实体的列表)并调用我的xmlentity
函数:
entities = {'nbsp',' ';
'ntilde','ñ'};
domNode = xmlentity(entities,'example.xml','example2.xml')
这将生成以下 XML 文件'example2.xml'
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE AddressBook
[
<!ENTITY nbsp " ">
<!ENTITY ntilde "ñ">
]>
<AddressBook>
<Entry>
<Name>Frieñdly J. Mathworker</Name>
<PhoneNumber>(508) 647-7000</PhoneNumber>
<Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address>
</Entry>
</AddressBook>
此外
domNode.getElementsByTagName('Name').item(0).getTextContent
返回'Frieñdly J. Mathworker'
。xmlentity
有关更多详细信息和注意事项,请参阅帮助。
还有很多其他方法可以解决这个问题,我的代码可能会适应其中的一些。外部 DTD 很方便,因为它们允许您使用一个文件来声明所有实体,然后您只需在一个简单的 DTD 中指明该文件的 URI(并将 XML 文件设置为非独立文件)。XSLT/Schema 是另一种选择。它要复杂得多,但具有更多功能。Matlab 对它也有更好的支持,但它仍然需要工作。