嗨,我有以下文件。
<?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 拒绝。