当前位置: 首页 > 科技观察

在命令行使用XMLStarlet解析XML

时间:2023-03-14 22:27:58 科技观察

使用终端上的XML工具包XMLStarlet,您就是XML明星。学习解析XML通常被认为是一件复杂的事情,但事实并非如此。XML的结构非常严格,因此相对可预测。还有许多其他工具可以帮助您使这项工作易于管理。我最喜欢的XML实用程序之一是XMLStarlet,这是一个用于终端的XML工具包,可让您验证、解析、编辑、格式化和转换XML数据。XMLStarLet是一个相对较小的命令,但它充满了浏览XML的潜力,因此本文将演示如何使用它来查询XML数据。安装XMLStarlet默认安装在CentOS、Fedora和许多其他现代Linux发行版上,因此您可以打开终端并键入xmlstarlet来访问它。如果尚未安装XMLStarLet,您的操作系统将为您安装它。或者,您可以使用包管理器安装xmlstarlet:$sudodnfinstallxmlstarlet在macOS上,您可以使用MacPorts或Homebrew。在Windows上,Chocolatey可用。如果一切都失败了,您可以从Sourceforge上的源代码手动安装它。使用XMLStarlet解析XML有许多工具可以帮助解析和转换XML数据,包括允许您编写自己的解析器的软件库,以及fop和xsltproc等复杂命令。但有时您不需要处理XML数据;您只需要一种方便的方法来从XML数据中提取、更新或验证重要数据。对于现成的XML交互,我使用xmlstarlet,这是一个用于常见XML处理任务的经典“瑞士军刀”应用程序。您可以通过运行--help命令查看它提供的选项:$xmlstarlet--helpUsage:xmlstarlet[][]其中是以下之一:ed(或edit)-编辑/更新XML文档sel(或选择)-选择数据或查询XML文档(XPATH等)tr(或转换)-使用XSLT转换XML文档val(或验证)-验证XMLdocument(s)(well-formed/DTD/XSD/RelaxNG)fo(orformat)-FormatXMLdocument(s)el(orelements)-显示XML文档的元素结构c14n(orcanonic)-XML规范化ls(或列表)-将目录列为XML[...]您可以通过将-help附加到这些子命令的末尾来获得更多帮助:$xmlstarletsel--help-Q或--quiet-不要向标准输出写入任何内容。-C或--comp-显示生成的XSLT-R或--root-打印根元素-T或--text-输出为文本(默认为XML)-I或--indent-indentoutput[...]使用sel命令选择数据可以使用xmlstarletselect(简称sel)命令查看XML格式的数据下面是一个简单的XML文档:Fedora7MoonshineLiveFedoraEverythingFedoraCore6Zod在XML文件中查找数据时,您的首要任务是专注于要探索的节点。如果您知道节点的路径,请使用选项的-value来指定完整路径。越早浏览文档对象模型(DOM)树,您就会看到越多的信息:$xmlstarletselect--template\--value-of/xml/os/linux/distribution\--nlmyfile.xmlFedora7MoonshineLiveFedoraEverythingFedoraCore6Zod--nl代表“换行”,插入大量的空白,保证输入结果后,终端显示换行。我在示例输出中删除了一些额外的空格。专注于进一步关注DOM树:$xmlstarletselect--template\--value-of/xml/os/linux/distribution/name\--nlmyfile.xmlFedoraFedoraCore有条件地选择用于导航和解析的最佳模板XML强大的工具之一称为XPath。它标准化了用于XML搜索和从XML库调用函数的语法。XMLStarlet能够解析XPath表达式,因此可以使用XPath函数进行条件选择。XPath具有丰富的功能集,并且在W3C中有很好的文档,但我发现Mozilla的XPath文档更加简洁。您可以使用方括号作为测试函数来将元素的内容与值进行比较。下面是对元素值的测试,它只返回与特定匹配项关联的版本号。假设示例XML文件包含所有以1开头的Fedora版本。要查看与旧名称“FedoraCore”关联的所有版本号(该项目从版本7开始的名称中删除了“Core”):$xmlstarletsel--template\--value-of'/xml/os/linux/distribution[name="FedoraCore"]/release'\--nlmyfile.xml654321通过将路径的--value-of更改为/xml/os/linux/distribution[name="FedoraCore"”]/codename,您可以看到这些版本的所有代号。匹配路径和获取目标值将XML标记视为节点的好处之一是,一旦找到节点,就可以将其视为数据的当前“目录”。它不是真正的目录,至少不是文件系统意义上的目录,而是可以查询的数据集合。为了帮助您将对象与“内部”数据分开,XMLStarlet区分您尝试使用--match选项匹配的内容和您使用--value-of选项匹配的数据值。假设您知道节点包含多少个元素。这是您的目标节点。到达此处后,您可以使用--value-of指定您想要的元素值。要查看所有元素,请使用点(.)表示当前位置:$xmlstarletsel--template\--match'/xml/os/linux/distribution/spin'\--value-of'.'--nlmyfile.xml\LiveFedoraEverything和浏览DOM一样,可以使用XPath表达式限制返回数据的范围。在此示例中,我使用last()函数检索自旋节点中的最后一个元素:$xmlstarletselect--template\--match'/xml/os/linux/distribution/spin'\--value-of'*[last()]'--nlmyfile.xmlEverything在这个例子中,我使用position()函数来选择自旋节点中的特定元素:$xmlstarletselect--template\--match'/xml/os/linux/distribution/spin'\--value-of'*[position()=2]'--nlmyfile.xmlFedora--match和--value选项可以重叠,因此如何一起使用它们取决于您。例如XML,这两个表达式做同样的事情:$xmlstarletselect--template\--match'/xml/os/linux/distribution/spin'\--value-of'.'\--nlmyfile.xmlLiveFedoraEverything$xmlstarletselect--template\--match'/xml/os/linux/distribution'\--value-of'spin'\--nlmyfile.xmlLiveFedoraEverything熟悉XMLXML有时会显得过分冗长而笨拙,但与之交互和构建的工具却让我惊叹不已。如果您想亲身体验XML,那么XMLStarlet可能是一个很好的切入点。下次您想打开XML文件查看其结构化数据时,试试XMLStarlet看看是否可以查询数据。您对XML越熟悉,它作为一种健壮而灵活的数据格式就越适合您。