0

我有一些具有 xmlns 声明的 XML,如下所示:

<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 解析器?

4

2 回答 2

3

我认为 lxml.etree 在这里做的是正确的事情。

根据规范,命名空间声明属性的值必须是“ IRI引用——标识命名空间的命名空间名称——或空字符串”

您的示例具有属性 value "http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd",它不是有效的 IRI(冒号在错误的位置,例如)

于 2013-04-08T02:59:01.237 回答
1

命名空间名称是否必须是有效 URI 的问题是一个令人烦恼的问题。当然,您在这里所拥有的是错误的;但是您的解析器是否“过分热心”是另一回事。

命名空间 1.1 规范在第 8 节中说,“处理器必须报告命名空间格式良好的违规行为,但不需要检查命名空间名称是否为合法 IRI”。

在实践中,大多数解析器不做这个检查,一旦大多数软件产品对强制执行规范中的规定宽容,执行它的软件开始不受用户欢迎。

于 2013-04-08T07:23:47.363 回答