1

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.
4

1 回答 1

1

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&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 对它也有更好的支持,但它仍然需要工作。

于 2013-11-26T20:03:09.600 回答