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.
答案 0 :(得分:1)
Matlab处理DTD的工具不完整。值得注意的是,如果您使用包含DTD的xmlread
读取XML文件,然后使用xmlwrite
将其保存回来,则将删除所有DTD内容(执行实体替换,因此您仍然可以无错误地解析和读取新文件)。没有简单的和只是插入DTD的真正健壮的方式 - 这个XML在一切都很严格的情况下,从文件读取和写入时应该非常小心。
然而,使用一些旧代码,我已经将一个非强大的解决方案混合在一起,只要你检查输出就可以在简单的情况下工作。您可以下载M文件和示例XML文件here。 xmlentity
函数通过读取内容,执行一些粗略的解析和写出新数据,将DTD实体添加到XML文件中。
我使用了以下'example.xml'
XML文件(from here),经过编辑以包含一些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。要解决此问题,将定义使用的两个实体(可以找到其他实体的列表here)并调用我的xmlentity
函数:
entities = {'nbsp',' ';
'ntilde','ñ'};
domNode = xmlentity(entities,'example.xml','example2.xml')
这会在'example2.xml'
中生成以下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也有更好的支持,但它仍然需要工作。