我正在尝试使用来自metadata.xml ebuild的www.gentoo.org/dtd/metadata.dtd对xmllint的=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-xmltool(from 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
答案 0 :(得分:1)
您的假设是正确的,问题是HTTPS。要解决此问题并节省一些BW和时间,repoman
将对本地文件进行验证,如果找不到则会对其进行预取。默认位置为REPO_ROOT/metadata/dtd/metadata.dtd
或DISTDIR/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退出。