有时,我必须根据 xsd 文件检查一些大型 xml 文件的有效性。我收到的最大 xml 文件的大小接近 1.5GB。
xmllint
占用了我所有的 RAM 和几乎所有的交换空间,总内存使用量为 18GB。因此,验证过程持续了 24 小时。
我的问题:是否有替代方案xmllint --schema
消耗更少的内存,也许利用一些流功能而不是将文件加载到内存?
我正在使用 xmllint 来解析具有多个标签的 xml 文件,并且每个标签都有多个属性。示例结构如下图:
<root>
<child attr1="abc" attr2="def" attr3="ghi" />
...
...
</root>
Run Code Online (Sandbox Code Playgroud)
我需要从属性中获取值attr1
,attr2
和attr3
.
到目前为止,我已经尝试了以下方法,它完美地给出了一个属性的数据
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 不接受它作为输入。
关于如何解决这个问题的任何想法?
我有一个很大的 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 文件,我需要将其附加到一组特定的标签之后。基本上文件结构如下所示:
<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 块,因为它很长。
我已经看过sed
并awk
要做到这一点,但我遇到了墙。我也看到了使用perl
来完成这个的例子,但我对 Perl 不太熟悉。据我了解,虽然,sed
和awk
都不是很大,在多匹配。
我需要进行多行匹配的原因是因为该<dict>
标记在 XML 文件中经常使用,我需要将一个块附加到该<key>servers</key>
部分,而不是替换其全部内容。
例如,我想将标签中的字段转换为该标签内的标签
<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
。
我想知道如何从以下格式拆分我的数据:
<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 脚本?
Ubuntu 14.04 值得信赖的塔尔。
假设我有一个名为“testmag”的目录,它可能包含数百个 xml 文件,而目录又包含许多 xml 文件。我不知道任何 xml 文件的名称,但我知道其中之一包含 tag <dbname>....</dbname>
。
现在如何找到包含上述标签的文件并将标签的值作为终端中的输出
我有一个 100 GB 的 xml 文档,我正在将其批量迁移到数据库。
在 中vim
,我可以编辑文件,但无法使用:wq
、:q
或保存更改:xx
。
我收到错误消息this file is read only - press ! to override
。
没有任何效果,所以我使用:q!
忽略我的更改并退出vim
.
我怎样才能保存我的更改?
奖金问题
如果我不等待整个文件加载到内存中并按Ctrl + c
查看已填充的内容,则保存该文档是否只会保存加载到内存中的内容并删除其余内容?
我需要审核 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
command-line ×2
linux ×2
xmllint ×2
data ×1
find ×1
osx ×1
permissions ×1
sed ×1
vim ×1