下面我有一个用于跟踪库存的 Adobe XML swidtag 示例。我需要在 bash 中使用 xmllint 解析出相关信息并将其输出到一个新的文本文件。
例如,我想解析以下内容
swid:entitlement_required_indicator
swid:product_title
swid:product_version
swid:name
swid:numeric
swid:major
swid:minor
swid:build
swid:review
Run Code Online (Sandbox Code Playgroud)
我试过使用它,但它不会让我读取命名空间
xmllint --xpath '//swid:product_version/swid:name/text()' file.xml
Run Code Online (Sandbox Code Playgroud)
我也试过
xmllint --xpath "//*[local-name1()='product_version']/*[local-name2()='name']/text()" file.xml
Run Code Online (Sandbox Code Playgroud)
但是得到了这些错误
xmlXPathCompOpEval: function local-nameame1 not found
XPath error : Unregistered function
XPath error : Stack usage errror
XPath evaluation failure
Run Code Online (Sandbox Code Playgroud)
Creative Suite 5 的示例标签文件 以下示例适用于序列化为 Creative Suite 5 Master Collection (Suite) 的 Adobe Photoshop CS5
<?xml version="1.0" encoding="utf-8"?>
<swid:software_identification_tag xsi:schemaLocation="http://standards.iso.org/iso/19770/-2/2008/schema.xsd software_identification_tag.xsd"
xmlns:swid="http://standards.iso.org/iso/19770/-2/2008/schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--Mandatory Identity elements -->
<swid:entitlement_required_indicator>true</swid:entitlement_required_indicator>
<swid:product_title>Acrobat XI Pro</swid:product_title> …
Run Code Online (Sandbox Code Playgroud) 如何在 shell 脚本中从命令行操作 XML?
有很多用于操作表格数据、替换环境变量或用正则表达式替换文本片段的命令,但我没有找到任何适用于 XML 的命令。
我的构建脚本需要在 xml 文档的主标签中插入一个带有内容的标签,我发现为此目的在 OS 中安装 java、perl 或 python 是一种矫枉过正(我的脚本是在带有 docker 图像的 gitlab 中完成的,所以这样做我使用 maven:3.5-jdk-8 图像中可用工具的工作将是一个梦想)。
我不想用 sed 操作 XML,尽管在我的构建脚本中它可以工作,因为它是evil。
示例:我有以下 xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- a lot of other tags-->
</project>
Run Code Online (Sandbox Code Playgroud)
我想插入以下块:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)
在项目标签内(并且它是在开头还是结尾完全无关紧要。
我是否首先需要html
通过类似的东西在野外奔跑jsoup
?不让它在人类意义上有效,可能会变成胡言乱语,但至少xmlstarlet
可以处理文件?
最好寻找一个可以像这样安装和使用的 CLI:
massage foo.html > bar.xhtml
或者至少是这些方面的东西。
用例:
thufir@doge:~/.html$
thufir@doge:~/.html$ curl http://int.soccerway.com/ > soccer.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 188k 0 188k 0 0 313k 0 --:--:-- --:--:-- --:--:-- 313k
thufir@doge:~/.html$
thufir@doge:~/.html$ xmlstarlet sel -t -v "/html/body/table/tr/td[1]" -n soccer.html
soccer.html:70.13: xmlParseEntityRef: no name
if (this.$ && this.$.fn && this.$.fn.jquery) {
^
soccer.html:70.14: xmlParseEntityRef: no name
if (this.$ && this.$.fn …
Run Code Online (Sandbox Code Playgroud) 我不喜欢大文本配置文件。所以,我想将我的rc.xml
文件拆分为多个文件:
rc.xml
rc.keyboard.xml
rc.mouse.xml
Run Code Online (Sandbox Code Playgroud) 在 Ubuntu 15.04 上,我尝试使用以下命令安装“igraph”:
pip install python-igraph
Run Code Online (Sandbox Code Playgroud)
为了,好吧,使用igraph
python 中的包来处理图形和东西。但是,安装失败并显示以下输出
/usr/bin/ld: cannot find -lxml2
/usr/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
Makefile:2357: recipe for target 'libigraph.la' failed
make[3]: *** [libigraph.la] Error 1
make[3]: Leaving directory '/tmp/pip-build-8dtEwd/python-igraph/tmp/igraph.dZXTk4/igraph-0.7.1/src'
Makefile:1377: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/tmp/pip-build-8dtEwd/python-igraph/tmp/igraph.dZXTk4/igraph-0.7.1/src'
Makefile:480: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/tmp/pip-build-8dtEwd/python-igraph/tmp/igraph.dZXTk4/igraph-0.7.1'
Makefile:382: recipe for target 'all' failed
make: *** [all] …
Run Code Online (Sandbox Code Playgroud) 我正在尝试版本控制 IntelliJ IDEA 配置文件。这是一个小示例:
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<ignored path="tilde.iws" />
<ignored path=".idea/workspace.xml" />
<ignored path=".idea/dataSources.local.xml" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ToolWindowManager">
<frame x="1201" y="380" width="958" height="1179" extended-state="0" />
<editor active="false" />
<layout>
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" …
Run Code Online (Sandbox Code Playgroud) 所以我有一个任务,我必须通过 bash shell 脚本来操作 XML 文件。
以下是步骤:
以下是删除了非必要信息的 XML 示例:
<fmreq:fileManagementRequestDetail xmlns:fmreq="http://foobar.com/filemanagement">
<fmreq:property>
<fmreq:name>form_category_cd</fmreq:name>
<fmreq:value>Memos</fmreq:value>
</fmreq:property>
<fmreq:property>
<fmreq:name>object_name</fmreq:name>
<fmreq:value>Correspondence</fmreq:value>
</fmreq:property>
</fmreq:fileManagementRequestDetail>
Run Code Online (Sandbox Code Playgroud)
我必须从 object_name 下的 value 元素中获取值,交叉引用它,然后用新值替换 form_category_cd value 元素下的值:
因此,如果 object_name -> value 是 Correspondence,那么 form_category_cd -> value 可能需要是 YYZ。
问题是,我只能使用我们服务器上可用的工具,因为我们的操作组限制我们使用手头的工具。这是一场争取更新 xmllint 然后被否决的斗争。我使用的版本不支持--xpath,相信我在美好的一天很难。此外,我可用的版本不支持命名空间,因此 xmllint 已出局。
我试过 sed,但它似乎不喜欢我的正则表达式,即使我尝试的每个测试器都工作正常。
正则表达式:
(<fmreq\:name>object_name<\/fmreq\:name>)(?:\n\s*)(<fmreq\:value>)(.*)(<\/fmreq\:value>)
Run Code Online (Sandbox Code Playgroud)
我需要获得第 3 组,但 sed 不会返回它。相反,它返回 XML 文件的全部内容。
sed -e 's/\(<fmreq\:name>object_name<\/fmreq\:name>\)\(?:\n\s*\)\(<fmreq\:value>\)\(.*\)\(<\/fmreq\:value>\)/\3/' < c3.xml
Run Code Online (Sandbox Code Playgroud)
我对 awk / gawk 不太熟悉,所以我也在努力弄清楚它们,但如果能找到解决方案,我会向他们开放。
很想有一个 awk / gawk 解决方案,只是为了让老板高兴,因为他是 awk 的老粉丝,但我会尽我所能,因为我很难过。
我再次必须使用手头的工具并且无法安装任何新的东西。
我有一堆包含 XML 标签的文件,例如:
<h> PIDAT <h> O
我需要删除<h>
该行中第一个之后的所有内容,以便我可以得到:
<h>
为此,我正在使用
sed -i -e 's/(^<.*?>).+/$1/' *.conll
但似乎 sed 无法识别$1
. (据我所知,$1
应该删除组中未包含的所有内容)。有没有办法实现这一目标?如果您能指出我正确的方向,我将不胜感激。
PS:我在正则表达式应用程序上测试了这些表达式并且它们起作用了,但它在命令行中不起作用。
我需要审核 XML 文件结构并需要生成一个仅显示 DOM 树结构并省略值的报告。本质上,我只是节点名称,没有值。我尝试使用 xmllint 和 xmlstarlet,但不知道如何执行此操作。
有谁知道执行此操作的任何工具或上述工具的示例?
cat $filename.xml | xmlstarlet format -t
给了我我需要的东西,但我想省略所有的价值。
我很难解析一个巨大的 XML 文件(大约 100GB,带有大节点)。我正在尝试通过删除不必要的标签来减小节点大小。例如,任何<text>
标签。
如果我使用本机 XML 解析器,例如xmlstarlet
xmlstarlet ed -P -d '//text' file.xml
Run Code Online (Sandbox Code Playgroud)
我面临同样的问题,即内存不足。
是否有一种安全的方法(内存占用很少)来删除所有<text></text>
对而不破坏 XML 结构?
xml ×10
xmlstarlet ×3
sed ×2
awk ×1
bash ×1
command-line ×1
docker ×1
files ×1
html ×1
openbox ×1
osx ×1
python ×1
shell-script ×1
xmllint ×1