标签: xml

替代 xmllint 来检查 xml 有效性

有时,我必须根据 xsd 文件检查一些大型 xml 文件的有效性。我收到的最大 xml 文件的大小接近 1.5GB。 xmllint占用了我所有的 RAM 和几乎所有的交换空间,总内存使用量为 18GB。因此,验证过程持续了 24 小时。

我的问题:是否有替代方案xmllint --schema消耗更少的内存,也许利用一些流功能而不是将文件加载到内存?

linux xml

5
推荐指数
1
解决办法
5646
查看次数

xmllint 在单次执行中显示超过 1 个属性的值

我正在使用 xmllint 来解析具有多个标签的 xml 文件,并且每个标签都有多个属性。示例结构如下图:

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>
Run Code Online (Sandbox Code Playgroud)

我需要从属性中获取值attr1,attr2attr3.

到目前为止,我已经尝试了以下方法,它完美地给出了一个属性的数据

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 
Run Code Online (Sandbox Code Playgroud)

这个输出

attr1="abc"
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,我们如何在字符串中指定多个属性来获得所需的输出

attr1="abc"
attr2="def"
attr3="ghi"
Run Code Online (Sandbox Code Playgroud)

我为此尝试了以下方法,但效果不佳:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 
Run Code Online (Sandbox Code Playgroud)

上面的输出是 echo 语句再次被重新回显,这意味着 xmllint 不接受它作为输入。

关于如何解决这个问题的任何想法?

command-line xml data xmllint

5
推荐指数
1
解决办法
2万
查看次数

sed 前 n 个出现结果集在 2 个标签/模式之间

我有一个很大的 XML 文件,我得到了 2 个标签之间的所有匹配项:

这是我所做的:

sed -n '/<tag>/,/<\/tag>/p' file.xml
Run Code Online (Sandbox Code Playgroud)

而且我需要过滤以仅获取前 N 次出现。我试过 l param 但这还不够:(

那么有人知道如何从所有结果集中获得 N 个匹配的事件吗?

例如。这里的xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
</root>

 sed -n '/<tag>/,/<\/tag>/p' file.xml 
Run Code Online (Sandbox Code Playgroud)

返回所有元素。

所以目标是过滤以获得前 n 个匹配的模式(元素是多行的)如果 n = 2 那么结果 =:

<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
<tag>
 <t1>john</t1>
 <t2>john</t2>
 <t3>john</t3>
</tag>
Run Code Online (Sandbox Code Playgroud)

xml sed

5
推荐指数
2
解决办法
9378
查看次数

在多行正则表达式匹配后插入行

我有一个 XML 文件,我需要将其附加到一组特定的标签之后。基本上文件结构如下所示:

<key>servers</key>
<dict>
... Server Details ...
</dict>
Run Code Online (Sandbox Code Playgroud)

我想匹配的行:

<key>servers</key>
<dict>
Run Code Online (Sandbox Code Playgroud)

并在 之后附加一段 XML 指定服务器连接<dict>。我在它自己的文本文件中有新的 XML 块,因为它很长。

我已经看过sedawk要做到这一点,但我遇到了墙。我也看到了使用perl来完成这个的例子,但我对 Perl 不太熟悉。据我了解,虽然,sedawk都不是很大,在多匹配。

我需要进行多行匹配的原因是因为该<dict>标记在 XML 文件中经常使用,我需要将一个块附加到该<key>servers</key>部分,而不是替换其全部内容。

xml text-processing regular-expression

5
推荐指数
1
解决办法
2395
查看次数

我可以使用 xmlstarlet 将 XML 中的字段转换为标签吗?

例如,我想将标签中的字段转换为该标签内的标签

<book name="Data Structure" price="250" pages="350"/>
Run Code Online (Sandbox Code Playgroud)

<book name="Data Structure"> 
<price>250</price>
<pages>350</pages>
</book>
Run Code Online (Sandbox Code Playgroud)

xmlstarlet我想使用或在 Linux 命令行中执行此操作sed

xml text-processing xmlstarlet

5
推荐指数
1
解决办法
833
查看次数

如何在shell脚本中解析xml文件

我想知道如何从以下格式拆分我的数据:

<datas>
 <data>
  <name>Name1</name>
 </data>
 <data>
  <name>Name2</name>
 </data>
</datas>
Run Code Online (Sandbox Code Playgroud)

到以下格式:

<data><name>Name1</name></data>
<data><name>Name2</name></data>
Run Code Online (Sandbox Code Playgroud)

解析后的数据将被发送到 Python 脚本,如下所示:

 python script.py <data><name>Name1<name></data>
 python script.py <data><name>Name2<name></data>
Run Code Online (Sandbox Code Playgroud)

我试过这样的命令:

echo 'cat /datas/data' | xmllint --shell file.xml
Run Code Online (Sandbox Code Playgroud)

但是如何将所需格式的输出传递给 Python 脚本?

xml text-processing

5
推荐指数
2
解决办法
1万
查看次数

在目录中递归搜索所有 xml 文件中的特定标签并 grep 标签的值

Ubuntu 14.04 值得信赖的塔尔。

假设我有一个名为“testmag”的目录,它可能包含数百个 xml 文件,而目录又包含许多 xml 文件。我不知道任何 xml 文件的名称,但我知道其中之一包含 tag <dbname>....</dbname>

现在如何找到包含上述标签的文件并将标签的值作为终端中的输出

command-line xml find

5
推荐指数
1
解决办法
4万
查看次数

无法在 Vim 编辑器中写入对文件的更改

我有一个 100 GB 的 xml 文档,我正在将其批量迁移到数据库。
在 中vim,我可以编辑文件,但无法使用:wq:q或保存更改:xx

我收到错误消息this file is read only - press ! to override
没有任何效果,所以我使用:q!忽略我的更改并退出vim.

我怎样才能保存我的更改?

奖金问题

如果我不等待整个文件加载到内存中并按Ctrl + c查看已填充的内容,则保存该文档是否只会保存加载到内存中的内容并删除其余内容?

linux osx vim permissions xml

5
推荐指数
1
解决办法
3万
查看次数

读取 XML 文件并仅提取节点名称和结构

我需要审核 XML 文件结构并需要生成一个仅显示 DOM 树结构并省略值的报告。本质上,我只是节点名称,没有值。我尝试使用 xmllint 和 xmlstarlet,但不知道如何执行此操作。

有谁知道执行此操作的任何工具或上述工具的示例?

cat $filename.xml | xmlstarlet format -t 给了我我需要的东西,但我想省略所有的价值。

xml xmllint xmlstarlet

5
推荐指数
2
解决办法
367
查看次数

删除大文件中的 XML 标记

我很难解析一个巨大的 XML 文件(大约 100GB,带有大节点)。我正在尝试通过删除不必要的标签来减小节点大小。例如,任何<text>标签。

如果我使用本机 XML 解析器,例如xmlstarlet

xmlstarlet ed -P -d '//text' file.xml
Run Code Online (Sandbox Code Playgroud)

我面临同样的问题,即内存不足。

是否有一种安全的方法(内存占用很少)来删除所有<text></text>对而不破坏 XML 结构?

xml text-processing xmlstarlet

5
推荐指数
2
解决办法
1352
查看次数