使用 MATLAB 的 xmlread() 解析 XML 转义序列



MATLAB 的 (v2103a) xmlread() 函数在遇到国际转义序列(如 ñ )时失败。有没有人有干净的解决方法?

例如,使用以下 XML 代码段解析 XML 文件时:

<Cell><Data ss:Type="String">Perdidas - A&ntilde;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&ntilde;dly J.&nbsp;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','&#160;';
            'ntilde','&#241;'};
domNode = xmlentity(entities,'example.xml','example2.xml')

这将生成以下 XML 文件'example2.xml'

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE AddressBook
[
   <!ENTITY nbsp "&#160;">
   <!ENTITY ntilde "&#241;">
]>
<AddressBook>
   <Entry>
      <Name>Frie&ntilde;dly J.&nbsp;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也有更好的支持,但它仍然需要工作。