MATLAB 的 (v2103a) xmlread() 函数在遇到国际转义序列(如 ñ
)时失败。有没有人有干净的解决方法?
例如,使用以下 XML 代码段解析 XML 文件时:
<Cell><Data ss:Type="String">Perdidas - Año0 (euros)</Data></Cell>
xmlread() 失败并显示以下错误:
[Fatal Error] resultados.xml:236:50: The entity "ntilde" was referenced, but not declared.
Matlab 处理 DTD 的工具不完整。值得注意的是,如果使用包含的 DTD xmlread
读取 XML 文件,然后使用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也有更好的支持,但它仍然需要工作。