使用 XMLStatart 插入行 xml 文件



嗨,我有以下文件。

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="" xmlns:uap="" IgnorableNamespaces="">
<Identity Name="xxxxxxxxxx" Publisher="CN=$username$" Version="xxxx"/>
<mp:PhoneIdentity PhoneProductId="xxxxxxxxxxx" PhonePublisherId=""/>
<Properties>
<DisplayName>xxxxxxxxxx</DisplayName>
<PublisherDisplayName>xxxxxxxx</PublisherDisplayName>
<Logo>imagesStoreLogo.png</Logo>
<Description>A sample Apache Cordova application that responds to the deviceready event.</Description>
</Properties>
<Dependencies>
<TargetDeviceFamily MaxVersionTested="" MinVersion="" Name="Windows.Universal"/>
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="" StartPage="">
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient"/>
<DeviceCapability Name="webcam"/>
<DeviceCapability Name="location"/>
</Capabilities>
</Package>

我想在功能元素下插入。因此,输出应如下所示

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="" xmlns:uap="" IgnorableNamespaces="">
<Identity Name="xxxxxxxxxx" Publisher="CN=$username$" Version="xxxx"/>
<mp:PhoneIdentity PhoneProductId="xxxxxxxxxxx" PhonePublisherId=""/>
<Properties>
<DisplayName>xxxxxxxxxx</DisplayName>
<PublisherDisplayName>xxxxxxxx</PublisherDisplayName>
<Logo>imagesStoreLogo.png</Logo>
<Description>A sample Apache Cordova application that responds to the deviceready event.</Description>
</Properties>
<Dependencies>
<TargetDeviceFamily MaxVersionTested="" MinVersion="" Name="Windows.Universal"/>
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="" StartPage="">
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient"/>
<Capability Name="privateNetworkClientServer"/>
<DeviceCapability Name="webcam"/>
<DeviceCapability Name="location"/>
</Capabilities>
</Package>

为了实现上述目标,我使用XMLStarlet如下。

xmlstarlet ed 
-a '/Package/Capabilities' -t elem -n Capability 
-i '/Package/Capabilities/Capability' -t attr -n Name -v privateNetworkClientServer 
<inputfile >outputfile

我得到的输出是相同的,没有任何修改。我有没有做傻事。

如果我去掉所有与命名空间相关的东西,那么

xmlstarlet ed 
-a '/Package/Capabilities/Capability[last()]' -t elem -n 'Capability' 
-a '/Package/Capabilities/Capability[last()]' -t attr -n Name -v privateNetworkClientServer 
inputfile.no_namespace

在最后一个功能之后添加节点:

<?xml version="1.0" encoding="utf-8"?>
<Package IgnorableNamespaces="">
...
<Capabilities>
<Capability Name="internetClient"/>
<Capability Name="privateNetworkClientServer"/>
<DeviceCapability Name="webcam"/>
<DeviceCapability Name="location"/>
</Capabilities>
</Package>

但是,对于给定的XML,xmlstarlet会吐出错误:

$ xmlstarlet ... inputfile
inputfile:2.93: xmlns:mp: Empty XML namespace is not allowed
ns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp=""
         ^
inputfile:2.106: xmlns:uap: Empty XML namespace is not allowed
hemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="" xmlns:uap=""
         ^
inputfile:4.69: Namespace prefix mp on PhoneIdentity is not defined
<mp:PhoneIdentity PhoneProductId="xxxxxxxxxxx" PhonePublisherId=""/>
^
[original XML here]

您正在处理无效的XML,而xmlstarlet不是很宽容。

目标节点存在于默认命名空间中,因此请调整 XPath 表达式:

xmlstarlet edit 
-a '/_:Package/_:Capabilities/_:Capability[last()]' -t elem -n 'Capability' 
-s '$prev' -t attr -n Name -v 'privateNetworkClientServer' 
file.xml
  • 使用 _(下划线)快捷键 由于默认命名空间是在根元素中声明的 (选项--doc-namespace生效)
  • $prev(又名$xstar:prev)变量是指节点 由最近的-i (--insert)-a (--append)或 创建-s (--subnode);$prev的例子在 doc/xmlstarlet.txt.

由于xmlstarlet edit中的错误 (见此) 引用$prev新创建的不在 null 命名空间中的元素。

由于xmlstarlet edit(与xmlstarlet select不同)不是XSLT 处理器 它将接受东西 - 例如xmlns:mp=""- XSLT处理器 将作为非 XML 拒绝。

相关内容

  • 没有找到相关文章

最新更新