我有一些XML有xmlns声明,如下所示:
<dc:record xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mods="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd">
这一行似乎是在Python中绊倒eTree XML解析器:
lxml.etree.XMLSyntaxError: xmlns:mods: 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd' is not a valid URI, line 6, column 63
如果我删除xmlns:mods声明中找到的两个URI之一,它就会解析。
因此,知道xmlns元素是为了帮助人类解析而不是特意被引用,这是对XML的真正约束(在xmlns名称空间声明中有一个URI),或者它是lxml etree解析器过度执行?
答案 0 :(得分:3)
我认为lxml.etree在这里做的是正确的。
根据the spec,名称空间声明属性的值必须是“IRI引用 - 标识名称空间的名称空间名称 - 或者是空字符串”
您的示例具有属性值"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd"
,它不是有效的IRI(错误位置的冒号,例如。)
答案 1 :(得分:1)
命名空间名称是否必须是有效URI的问题是一个烦恼的问题。当然你在这里错了;但是你的解析器是否“过度热心”是另一回事。
命名空间1.1规范在第8节中说,“处理器必须报告对命名空间格式良好的违反,除了不需要检查命名空间名称是否是合法的IRI”。
在实践中,大多数解析器都不会进行此检查,并且一旦大多数软件产品对于在规范中强制执行规定宽松,那么执行它的软件开始变得不受用户欢迎。