【发布时间】:2020-03-20 00:28:12
【问题描述】:
无法理解为什么我的简单 xpath 不适用于以下 XML。
我需要找到节点“部署”并删除子节点,然后添加一个新的子节点。应该很容易,但是不,XML 中有一些东西使我的代码无法通过简单地按名称选择部署节点来找到它。
XML(Clickonce .Net XML)
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
<assemblyIdentity name="PublishDev.app" version="3.1.0.182" publicKeyToken="38f29cb66cf790f2" language="neutral" processorArchitecture="x86" xmlns="urn:schemas-microsoft-com:asm.v1" />
<description asmv2:publisher="KLP" asmv2:product="PublishDev" xmlns="urn:schemas-microsoft-com:asm.v1" />
<deployment install="true">
<subscription>
<update>
<expiration maximumAge="0" unit="days" />
</update>
</subscription>
<deploymentProvider codebase="http://nrs.dev/NrsClient/PublishDev.application" />
</deployment>
<compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
<framework targetVersion="4.7" profile="Client" supportedRuntime="4.0.30319" />
<framework targetVersion="4.7" profile="Full" supportedRuntime="4.0.30319" />
</compatibleFrameworks>
<dependency>
<dependentAssembly dependencyType="install" codebase="ApplicationFiles\PublishDev_3_1_0_182\PublishDev.exe.manifest" size="48466">
<assemblyIdentity name="PublishDev.exe" version="3.1.0.182" publicKeyToken="38f29cb66cf790f2" language="neutral" processorArchitecture="x86" type="win32" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<dsig:DigestValue>zbbwOLiL12PznwEX7G3FGhmU8R0=</dsig:DigestValue>
</hash>
</dependentAssembly>
</dependency>
</asmv1:assembly>
然后使用 Powershell 循环 XML
function loopXml{
param(
$nodes
)
write-host "************************* Loop my xml********************* "
foreach ($node in $nodes) {
Write-host $node.toString()
}
}
$deployManifestFullPath = "D:\temp\stripped.xml"
$sourcexml = [xml](get-content $deployManifestFullPath);
$nodes = $sourcexml.SelectNodes("deployment")
loopXml $nodes
$nodes = $sourcexml.SelectNodes("//*", $ns)
loopXml $nodes
输出
************************* Loop my xml*********************
************************* Loop my xml*********************
assembly
assemblyIdentity
description
deployment
subscription
update
expiration
deploymentProvider
compatibleFrameworks
framework
framework
dependency
dependentAssembly
assemblyIdentity
hash
Transforms
Transform
DigestMethod
DigestValue
我不明白为什么行
$nodes = $sourcexml.SelectNodes("deployment")
不返回部署节点。当我选择整个文档时,它就在那里,但是......好吧,需要一些帮助来弄清楚这个。
参考。 w3schools XPath Syntax 只需添加节点名称即可选择具有该名称的所有节点。在我的例子中,单个节点名为部署。
【问题讨论】:
标签: xml powershell