如何在gentoo中验证针对.dtd的metadata.xml?

时间:2016-02-20 22:43:43

标签: metadata dtd gentoo

我正在尝试使用来自metadata.xml ebuild的www.gentoo.org/dtd/metadata.dtdxmllint=dev-libs/libxml2-2.9.3进行验证。

我尝试了命令(一些来自here):

$ xmllint --noout --valid  metadata.xml
error : Unknown IO error
metadata.xml:2: warning: failed to load external entity "http://www.gentoo.org/dtd/metadata.dtd"

xmllint metadata.xml --dtdvalid metadata.dtd的情况相同 和xmllint --loaddtd http://www.gentoo.org/dtd/metadata.dtd

$ xmllint --valid  metadata.xml --schema metadata.dtd
metadata.dtd:1: parser error : StartTag: invalid element name

我需要xmllint而不是mono-xmltoolfrom C#/CLI),因为xmllint用于repoman -d命令。 repoman用于travis-ci中的gentoo叠加验证

如何正确使用xmllint验证xml?

UPD: 网站返回" HTTP / 1.1 301永久移动"这就是加载失败的原因

strace的一部分:

recvfrom(3, "HTTP/1.1 301 Moved Permanently\r\n"..., 4096, 0, NULL, NULL) = 446
recvfrom(3, "", 4096, 0, NULL, NULL)    = 0
close(3)                                = 0
write(2, "error : ", 8error : )                 = 8
write(2, "Unknown IO error\n", 17Unknown IO error

可能libxml2没有做https

USE="icu ipv6 python readline -debug -examples -lzma -static-libs {-test}"

libxml2使用nanoHTTP,nanoHTTP can work with HTTPS

1 个答案:

答案 0 :(得分:1)

您的假设是正确的,问题是HTTPS。要解决此问题并节省一些BW和时间,repoman将对本地文件进行验证,如果找不到则会对其进行预取。默认位置为REPO_ROOT/metadata/dtd/metadata.dtdDISTDIR/metadata.dtd。要获得repoman xmllint使用的确切参数,您必须查看其源代码 - here。如你所见,它是

xmllint --nonet --noout --dtdvalid <metadata.dtd> metadata.xml

此命令仍然输出:

metadata.xml:2: warning: failed to load external entity "https://www.gentoo.org/dtd/metadata.dtd"
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">

或在HTTP的情况下:

I/O error : Attempt to load network entity http://www.gentoo.org/dtd/metadata.dtd
metadata.xml:2: warning: failed to load external entity "http://www.gentoo.org/dtd/metadata.dtd"
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">

但仅作为警告,所以命令以0退出。