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

时间:2013-11-08 17:52:51

标签: xml matlab escaping

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.

1 个答案:

答案 0 :(得分:1)

Matlab处理DTD的工具不完整。值得注意的是,如果您使用包含DTD的xmlread读取XML文件,然后使用xmlwrite将其保存回来,则将删除所有DTD内容(执行实体替换,因此您仍然可以无错误地解析和读取新文件)。没有简单的只是插入DTD的真正健壮的方式 - 这个XML在一切都很严格的情况下,从文件读取和写入时应该非常小心。

然而,使用一些旧代码,我已经将一个非强大的解决方案混合在一起,只要你检查输出就可以在简单的情况下工作。您可以下载M文件和示例XML文件herexmlentity函数通过读取内容,执行一些粗略的解析和写出新数据,将DTD实体添加到XML文件中。

我使用了以下'example.xml' XML文件(from here),经过编辑以包含一些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。要解决此问题,将定义使用的两个实体(可以找到其他实体的列表here)并调用我的xmlentity函数:

entities = {'nbsp','&#160;';
            'ntilde','&#241;'};
domNode = xmlentity(entities,'example.xml','example2.xml')

这会在'example2.xml'中生成以下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也有更好的支持,但它仍然需要工作。