ubuntu 当第一个元素中存在多个xmlns属性时,xmlstarlet无法添加子节点

bjp0bcyl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(212)

我有一个xml文件test.gpx

cat test.gpx

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1">
  <trk>
    <name>Name 1</name>
    <desc>Description 1</desc>
  </trk>
  <trk>
    <name>Name 2</name>
    <desc>Description 2</desc>
  </trk>
</gpx>

字符串
xmlstartlet无法成功执行尝试在此文件中插入子节点:

xmlstarlet edit --subnode "/gpx/trk" --type  elem -n "new" -v "Hello World!" test.gpx

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1">
  <trk>
    <name>Name 1</name>
    <desc>Description 1</desc>
  </trk>
  <trk>
    <name>Name 2</name>
    <desc>Description 2</desc>
  </trk>
</gpx>


而在第一个gpx元素中只有一个属性,它可以工作:

xmlstarlet edit --subnode "/gpx/trk" --type  elem -n "new" -v "Hello World!" test.gpx

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trk>
    <name>Name 1</name>
    <desc>Description 1</desc>
    <new>Hello World!</new>
  </trk>
  <trk>
    <name>Name 2</name>
    <desc>Description 2</desc>
    <new>Hello World!</new>
  </trk>
</gpx>


因此,我的问题是:我如何才能成功地处理原始文件,在它的第一个gpx元素中有多个属性?
版本信息:

xmlstarlet --version
1.6.1
compiled against libxml2 2.9.10, linked with 20913
compiled against libxslt 1.1.34, linked with 10134


在Ubuntu 22.04上。

2w2cym1i

2w2cym1i1#

你要处理的属性不仅仅是普通的属性-they are namespaces,而且必须相应地考虑。因为你在第一个文件(而不是第二个)中有一个默认的名称空间,你可以用两种方法之一来处理它。
长,明确的方式:

xmlstarlet ed -N x=http://www.topografix.com/GPX/1/1 --subnode "/x:gpx/x:trk" --type  elem -n "new" -v "Hello World!" test.gpx

字符串
或较短的:

xmlstarlet ed  --subnode "/_:gpx/_:trk" --type  elem -n "new" -v "Hello World!" test.gpx


任何一个都应该给予您预期的输出。

相关问题