草庐IT

xmllint : how to validate an XML using a local DTD file

coder 2024-06-23 原文

我有一个本地 DTD 文件 test.dtd。内容是:

<!DOCTYPE coord [
<!ELEMENT coord (date)>
<!ELEMENT date (#PCDATA)>
]>

我想使用 xmllint 验证 XML。此 XML 中没有 DOCTYPE:

<?xml version="1.0" encoding="x-mac-roman"?>
<coord>
    <date>20150312</date>
</coord>

如果我将 DTD block 作为第二行插入到我的 XML 文件的副本中并使用:

xmllint --valid --noout my2.xml

但是当我尝试时:

xmllint --loaddtd test.dtd --valid --noout my.xml

xmllint --dtdvalid test.dtd --noout my.xml

两者都不行。输出是:

test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
Could not parse DTD test.dtd

有什么想法吗?似乎我的 XML 必须 包含一个 DOCTYPE 行(带有 SYSTEM 关键字)以引用我想避免的外部 DOCTYPE 文件。请参阅:http://www.w3schools.com/dtd/

有没有不修改XML的解决方案?

最佳答案

首先,外部 DTD 不需要 <!DOCTYPE序言 - 从 DTD 文件中删除它:

<!ELEMENT coord (date)>
<!ELEMENT date (#PCDATA)>

然后,--loaddtd 获取外部 DTD,这与针对外部 DTD 进行验证不同。使用 --dtdvalid选项如下:

$ xmllint --noout --dtdvalid test.dtd test.xml

如果 XML 文档有效,xmllint 将不会输出任何内容(因为 --noout)。如果您将 DTD 更改为:

<!ELEMENT coord (date,other)>
<!ELEMENT date (#PCDATA)>

输出将是

$ xmllint --noout --dtdvalid test.dtd test.xml
test.xml:2: element coord: validity error : Element coord content does not follow the DTD, expecting (date , other), got (date )
Document test.xml does not validate against test.dtd

NMT 的文档页面上查找更多信息或 XMLSoft .

关于xmllint : how to validate an XML using a local DTD file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29072962/

有关xmllint : how to validate an XML using a local DTD file的更多相关文章

  1. xml - 使用 xmllint 提取最后一个子元素值 - 2

    我有下面的XML并且想提取最后一个版本元素的值org.continuous.IntegrationContinuous-Integration1.11-SNAPSHOT1.12-SNAPSHOT1.13-SNAPSHOT1.14-SNAPSHOT1.15-SNAPSHOT........1.N-SNAPSHOT20161220194944我正在使用xmllint并且下面的命令返回所有版本值echo"cat//versioning/versions/version"|xmllint--shellmaven-metadata.xml|sed'/^\/>/d'|sed's/]*.//g'20

  2. 使用 xmllint : complains about empty tags like <foobar/> 进行 XML 模式验证 - 2

    我在使用xmllint根据XSD模式验证XML文件时遇到问题:xmllintcompainswithavalidityerrorthatataglike虽然foobar不符合预期在XSD架构中定义如下:比较:123根据xmllint是有效的。xmllint也不会提示,如果我去掉thsfoobar完全从XML文件中标记。问题:那么,拒绝有什么意义呢??谢谢!P.S.:实际的错误信息:myfile.xml:135298:elementfoobar:Schemasvalidityerror:Element'{http://www.foobaz.com/namespace}foobar':''

  3. xml - 通过在 bash 中使用 xmllint 从具有命名空间的 xml 文件中提取值 - 2

    我需要从此xml中提取名称值(产品查找器):文件:config.xmlProductFinderDescription我试过:mles$xmllint--xpath"/widget/name/text()"config.xmlXPathsetisempty这可能是因为我的config.xml文件有其他命名空间。根据this问题我需要手动设置命名空间。所以我试过了:mles$xmllint--shellconfig.xml/>setnsx=http://www.w3.org/ns/widgets/>xpath/x:widget/name/text这个没有输出。使用xmllint提取名称值

  4. xml - 使用 xmllint 从 XML 中读取 CDATA 标记值,而无需 shell 脚本中的任何额外信息 - 2

    如何在没有任何额外信息的情况下从xml中读取cdata标签信息测试.xml测试.shStreamingkey="$(echo"cat/EncodingKeys/Streaming/text()"|xmllint--nocdata--shelltest.xml|sed'1d;$d')"Uploadskey="$(echo"cat/EncodingKeys/Uploads/text()"|xmllint--nocdata--shelltest.xml|sed'1d;$d')"echo$Streamingkeyecho$Uploadskey实际输出:54G91A8?s7^F97C]Fyj*8

  5. ID 属性的 xmllint 验证错误 - 2

    我正在尝试验证此XML文档:AliceBob针对以下DTD:运行xmllint--dtdvalidtest.dtdtest.xml产生:test.xml:3:elementCONTACT:validityerror:SyntaxofvalueforattributeCONTACT_NUMofCONTACTisnotvalidtest.xml:7:elementCONTACT:validityerror:SyntaxofvalueforattributeCONTACT_NUMofCONTACTisnotvalidDocumenttest.xmldoesnotvalidateagainst

  6. xml - 如何在 Sublime Text 3 中使用 xmllint? - 2

    我最近在SublimeText3中安装了SublimeLinter,以帮助我正确编写JavaScript文件。我还设置了xmllint来帮助我处理我使用的XML文件。但是我无法让它在SublimeText3中运行。我关注了thesesteps要安装并运行它,我可以从命令提示符中列出它的目录,一切都井井有条。SublimeText3中也启用了Xmllint。但是,当我在SublimeText3中处理XML文件时,linter似乎无法正常工作。如何配置xmllint以便它在SublimeText3中运行? 最佳答案 找到答案here在底

  7. xml - 谁是对的,谁做了错误的验证(我、XMLSpy、lxml.etree 或 xmllint) - 2

    我尝试使用同一文件夹中随后的xsd文件验证以下XML。根据AltovaXMLSpy的说法,这是完全有效的,但为了帮助一些没有许可证的同事找出基本错误,我尝试使用python和“lxml.etree”以及xmllint验证文件。这两个说xml无效并显示相同的消息:machineDB.xml:20:Schemasvalidityerror:Element'canframe':Nomatchfoundforkey-sequence['remotebus']ofkeyref'busRef'.machineDB.xmlfailstovalidate有人可以帮助找出任何人的错误吗?版本:Altov

  8. xml - 使用 xmllint 获取多个值 - 2

    我想使用xmllint中的xpath来获取主机名和序列号。这是XML..我可以获取主机名为blah*的所有连续剧:/>cat//hosts/host[starts-with(@name,"blah")]/@serial-------serial="ABC001"-------serial="ABC002"但我也想看看哪个主机名有那个序列号。这可能吗? 最佳答案 这可以在xmllint中使用以下XPath表达式完成。假设您的XML名为hosts.xml。xmllinthosts.xml--xpath'//host[starts-wit

  9. xml - 使用 xmllint 命令行的模式 - 2

    ]$xmllint--versionxmllint:usinglibxmlversion20626我的xml文件看起来像这样:............例如,我想在给定条件name==ARCH2和state==StringC2的情况下获取值StringB2。是否可以使用xmllint命令行选项,如果可以,如何使用?一些例子将是有益的。我可以使用sed或awk提取这些,但这可能不是一个好的解决方案。 最佳答案 尝试以下操作xmllint--xpath'string(///project[../@name="ARCH1"and@state

  10. 输出行的 xmllint 问题 - 2

    我知道我的问题包括2个问题...起初,我想用xmllint输出“loc”内容标签。我加载的站点地图有一个xmlns="..."。在xmllintshell上,我需要这样做:setrootnsxpath//defaultns:loc那行得通……没问题。但我需要在bash脚本中执行此操作。(AFAIK)xmllint没有告诉“我们走吧,setrootns”的选项,所以我不能这样做:xmllint--xpath"//loc"sitemaps.xml#orxmllint--xpath"//defaultns:loc"sitemaps.xml这是第一个问题,我如何告诉xmllint加载默认的ns

随机推荐