我需要从 XML 文件中提取一些值,然后我偶然发现了XMLStarlet这似乎非常强大。我对 XML 知之甚少,因此我对该工具感到不知所措,可能只需要其中很小的一部分。我有一个类似下面的文件,我想获取以下地址:
<es:ipAddress>123_Westbrook</es:ipAddress>
我该如何输入这个内容?
这些额外字段的意义是什么es
?我假设这括住了这个特定的对象(ipAddress
值,123 Westbrook
),但路径的哪一部分实际上是分配给XMLStarlet? 括号? 参数名称? 用斜线分隔?
也许:
xmlstarlet sel '<bulkCmConfigDataFile xmlns:gn="JOE.xsd"> < configDat dnPrefix="Undefined"> < xn:Subnetwork id="Oz"><xn:MeContext id="BANANS"><xn:attributes><es:vsDataMeContext><es:ipAddress>
哪个应该指向值123_Westbrook
?插入斜线?还是其他什么?
原始文件非常大,因此这里是 XML 的第一部分(由于仅发布部分内容,因此缺少许多结束标记):
1 <?xml version="1.0" encoding="UTF-8"?>
2 <bulkCmConfigDataFile xmlns:un="utranNrm.xsd"
3 xmlns:es="FRED.99.88.xsd"
4 xmlns:xn="JIM.xsd" xmlns:gn="JOE.xsd" xmlns="CARL.xsd">
5 <fileHeader fileFormatVersion="THE_GOOD_OND" vendorName="Mr. Softie"/>
6 <configData dnPrefix="Undefined">
7 <xn:SubNetwork id="ROOM_4_MORE">
8 <xn:SubNetwork id="Oz">
9 <xn:attributes>
10 <xn:userDefinedNetworkType>SECRET_SERVICE</xn:userDefinedNetworkType>
11 <xn:userLabel>OZ</xn:userLabel>
12 </xn:attributes>
13 <xn:MeContext id="BANANAS">
14 <xn:VsDataContainer id="BANANAS">
15 <xn:attributes>
16 <xn:vsDataType>SECRET_SQUIRREL</xn:vsDataType>
17 <xn:vsDataFormatVersion>GOOD_HUMOR</xn:vsDataFormatVersion>
18 <es:vsDataMeContext>
19 <es:userLabel>ORANGE</es:userLabel>
20 <es:ipAddress>123_Westbrook</es:ipAddress>
21 <es:neMIMversion>S-11</es:neMIMversion>
22 <es:lostSynchronisation>SYNCHRONISED</es:lostSynchronisation>
23 <es:bcrLastChange>LAST_DATE</es:bcrLastChange>
24 <es:bctLastChange>LAST_DATE</es:bctLastChange>
25 <es:multiStandardRbs6k>uh-uh</es:multiStandardRbs6k>
答案1
要使用 xmlstarlet 获取该元素“es:ipAddress”的值:
xmlstarlet sel -t -v '//es:ipAddress' thefilename.xml
打印:“123_Westbrook”。
答案2
这些额外字段的意义是什么
es
?
es
意味着ipAddress
来自FRED.99.88.xsd
XML Schema - 查看命名空间定义(根标签属性xmlns:es="FRED.99.88.xsd"
之一)。bulkCmConfigDataFile
我假设这个括号内是这个特定对象(ipAddress 值,123 Westbrook),但路径的哪一部分实际上是提供给 XMLStarlet 的?
根据XMLStarlet文档:
sel (或 select) - 选择数据或查询 XML 文档 (XPATH 等)
之后xmlstarlet sel --help
:
XMLStarlet Toolkit: Select from XML document(s)
Usage: xmlstarlet sel <global-options> {<template>} [ <xml-file> ... ]
where
<global-options> - global options for selecting
<xml-file> - input XML document file name/uri (stdin is used if missing)
<template> - template for querying XML document with following syntax:
<global-options> are:
-Q or --quiet - do not write anything to standard output.
-C or --comp - display generated XSLT
-R or --root - print root element <xsl-select>
-T or --text - output is text (default is XML)
-I or --indent - indent output
-D or --xml-decl - do not omit xml declaration line
-B or --noblanks - remove insignificant spaces from XML tree
-E or --encode <encoding> - output in the given encoding (utf-8, unicode...)
-N <name>=<value> - predefine namespaces (name without 'xmlns:')
ex: xsql=urn:oracle-xsql
Multiple -N options are allowed.
--net - allow fetch DTDs or entities over network
--help - display help
Syntax for templates: -t|--template <options>
where <options>
-c or --copy-of <xpath> - print copy of XPATH expression
-v or --value-of <xpath> - print value of XPATH expression
-o or --output <string> - output string literal
-n or --nl - print new line
-f or --inp-name - print input file name (or URL)
-m or --match <xpath> - match XPATH expression
--var <name> <value> --break or
--var <name>=<value> - declare a variable (referenced by $name)
-i or --if <test-xpath> - check condition <xsl:if test="test-xpath">
--elif <test-xpath> - check condition if previous conditions failed
--else - check if previous conditions failed
-e or --elem <name> - print out element <xsl:element name="name">
-a or --attr <name> - add attribute <xsl:attribute name="name">
-b or --break - break nesting
-s or --sort op xpath - sort in order (used after -m) where
op is X:Y:Z,
X is A - for order="ascending"
X is D - for order="descending"
Y is N - for data-type="numeric"
Y is T - for data-type="text"
Z is U - for case-order="upper-first"
Z is L - for case-order="lower-first"
...
你可能会使用XPath在此处选择 XML 文件元素。
哪个应该指向值 123_Westbrook?插入斜线?还是其他什么?
由于您的问题对我来说似乎是一种家庭作业,因此我仅给您: