代码之家  ›  专栏  ›  技术社区  ›  Ben Blank Jarret Hardie

用于Windows的命令行XML验证程序

  •  15
  • Ben Blank Jarret Hardie  · 技术社区  · 15 年前

    我一直认为针对模式的验证是针对thinkos的无价之宝,并且希望将验证检查作为项目的一部分,在这个项目中,我经常需要手工编写几百行长度的XML文件。我的文本编辑器有一个相当好的CLI集成功能,所以我在寻找命令行验证器。

    当我没有通过谷歌找到任何明确的赢家时,我在这里四处寻找,发现了一个 similar question 但是没有一个工具能满足我的需求:

    (*我正在验证的模式不恰当地使用了替代组,但它是项目外部的,因此我不能更改它,这导致 xmlstarlet 即使在有效的文件上也会窒息。)

    通常,这是解决一个问题的关键,在这个问题上,我会放弃寻找现有的解决方案,转而寻求Python Hammer,但Python的XML支持是众所周知的“臭名昭著”,实际上,让我们把它放在“臭名昭著”的位置。

    所以我要重新寻找一个已经存在的工具。我的要求很简单:

    • 在Win32上运行(特别是Windows XP SP3)
    • 命令行;我的编辑器可以处理stdin/-out/-err、参数、临时文件等任意组合。
    • 相当完整的XSD支持(特别是名称空间和替换组)
    • 报告发生错误的行号!

    这种工具存在吗?我不想安装Visual Studio和朋友(过于臃肿,IMO),但我已经安装了cygwin和python。

    6 回复  |  直到 11 年前
        1
  •  13
  •   13ren    15 年前

    您的第一个选项xmllint(libxml2)给出了XML(以及XSD)中错误的行号。你可能只需要更新的版本。我刚刚用我的副本确认了这两个问题,即:

    >  xmllint --version
    xmllint: using libxml version 20627
    

    实例输出:

    invalidXml.xml:4: element c: Schemas validity error : Element 'c': This element is not expected. Expected is ( b ).
    invalidXml.xml fails to validate
    <?xml version="1.0"?>
    <invalidXmlEg>
      <a/>
    <!--  <b></b> -->
      <c/>
    </invalidXmlEg>
    

    其中xsd是:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="invalidXmlEg">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="a" type="xs:string" />
            <xs:element name="b" type="xs:string" />
            <xs:element name="c" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    注意:我注意到xmlint将接受它不应该接受的元素名(例如 <invalidXml.xsd> “),但这似乎不会影响您的任务。

    编辑 添加版本的“编译时使用”部分:

     compiled with: Threads Tree Output Push Reader
     Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy
     C14N Catalog XPath XPointer XInclude Iconv ISO8859X
     Unicode Regexps Automata Expr Schemas Schematron
     Modules Debug Zlib 
    
        2
  •  3
  •   Nic Gibson    15 年前

    正如上面提到的13ren,libxml的xmlint会报告行号——也许您有版本问题。从中获取libxml/libxslt工具的本机(非cygwin)版本可能会很有用。 http://www.zlatkovic.com/libxml.en.html

    您可能还想看看MSV Sun . 它不是XSD的完整实现,但可以完成这项工作(我通常使用它来放松验证)

        3
  •  2
  •   Bas Bossink    15 年前

    我建议 Windows Powershell 具有 PowerShell Community eXtensions . pscx具有具有以下内容的test-xml cmdlet Get-Help 详细说明:

    测试格式是否正确,并可以根据XML模式进行验证。它不处理指定targetname 空间。若要查看验证错误消息,请指定-verbose标志。

    我不知道它是否用行号报告错误,但3/4也不错。

        4
  •  1
  •   John Saunders    15 年前

    你可以试试 Visual Studio 2008 Express 版本。现在有更好的XML支持,包括验证,当然还有XML IntelliSense、XML片段和XML模式视图。

        5
  •  1
  •   JReader    11 年前

    无法评论,但来自igor zlatkovic的最新版本的xmllint(20708)Windows端口也提供了行号。

        6
  •  0
  •   Juris    15 年前

    Xerces-J附带了一个示例应用程序, jaxp.SourceValidator . 您可以将XML文件提供给它,它将对其进行验证。

    至于XeSer-C,我自己还没有使用它,但是我知道它不需要所有的Visual C++,它只需要它。 运行时 文件夹。这些可以从微软单独下载。似乎有一个示例应用程序可以满足您的需要-请参阅 StdInParse