[英]Modify Appxmanifest - Add Element to XML via Powershell
現在我正在研究 Azure DevOps Building Pipeline,並且一直堅持以我需要的方式操作生成的 Package.appxmanifest。
我有的:
<Package>
<Capabilities>
<uap2:Capability Name="spatialPerception" />
</Capabilities>
</Package>
我需要的:
<Package>
<Capabilities>
<uap2:Capability Name="spatialPerception" />
<rescap:Capability Name="perceptionSensorsExperimental" />
</Capabilities>
</Package>
我嘗試創建一個Element
,向其添加一個Attribute
,然后將Element
作為子元素添加到Capabilities
。 但這會產生錯誤的東西。 例如:
電源外殼#1:
$newElement = $manifest.Package.Capabilities.AppendChild($manifest.CreateElement("rescap:Capability"))
$newElement.SetAttribute(“Name”,”perceptionSensorsExperimental”)
生成#1:
<Package>
<Capabilities>
<uap2:Capability Name="spatialPerception" />
<Capability Name="perceptionSensorsExperimental" xmlns="" />
</Capabilities>
</Package>
如何創建上述行,由rescap:Capability
和屬性Name="perceptionSensorsExperimental"
組成?
- 編輯
完整的初始Package.appxmanifest
文件:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10"
ignorableNamespaces="uap uap2 uap3 uap4 mp mobile iot rescap"
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
<Identity Name="XXXX" Publisher="CN=XXXX" Version="1.0.0.0" />
<Properties>
<DisplayName>XXXX</DisplayName>
<PublisherDisplayName>XXXXX</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.10240.0" MaxVersionTested="10.0.22621.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="XXXX.App">
<uap:VisualElements DisplayName="XXXXX" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="XXXX" BackgroundColor="transparent">
<uap:DefaultTile ShortName="XXXX" Wide310x150Logo="Assets\Wide310x150Logo.png" />
<uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#FFFFFF" />
<uap:InitialRotationPreference>
<uap:Rotation Preference="landscape" />
<uap:Rotation Preference="landscapeFlipped" />
<uap:Rotation Preference="portrait" />
<uap:Rotation Preference="portraitFlipped" />
</uap:InitialRotationPreference>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
<Capability Name="internetClientServer" />
<Capability Name="privateNetworkClientServer" />
<uap:Capability Name="sharedUserCertificates" />
<uap2:Capability Name="spatialPerception" />
<DeviceCapability Name="webcam" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="gazeinput" />
</Capabilities>
</Package>
使用 Xml Linq:
using assembly System
using assembly System.Linq
using assembly System.Xml.Linq
$inputFilename = "c:\temp\test.xml"
$outputFilename = "c:\temp\test1.xml"
$xDoc = [System.Xml.Linq.XDocument]::Load($inputFilename)
$root = [System.Xml.Linq.XElement]$xDoc.Root
#Write-Host "root = " $root
$ns = [System.Xml.Linq.XNamespace]$root.GetDefaultNamespace()
$nsUap2 = [System.Xml.Linq.XNamespace]$root.GetNamespaceOfPrefix("uap2")
$Capabilities = $xDoc.Descendants($ns + "Capabilities")
$Capability = [System.Linq.Enumerable]::First($Capabilities)
$newElement = New-Object System.Xml.Linq.XElement($nsUap2 + "Capability")
$newElement.SetAttributeValue("Name", 'perceptionSensorsExperimental')
$Capability.Add($newElement)
Write-Host $xDoc
$xDoc.Save($outputFilename)
當您使用.CreateElement()
創建新節點時,您可以為其提供第三個參數,即從xmlns:rescap
聲明中獲取的 url
通過使用它,事情應該按預期工作:
# the full path and filename
$file = 'D:\Test\Package.appxmanifest'
# load the xml file. This way, you are ensured to get the file encoding correct
$xml = [System.Xml.XmlDocument]::new()
$xml.Load($file)
# use the url from the `xmlns:rescap` declaration
$nsUri = $xml.DocumentElement.GetNamespaceOfPrefix('rescap')
$newNode = $xml.CreateElement("rescap", "Capability", $nsUri)
$newNode.SetAttribute("Name","perceptionSensorsExperimental")
[void]$xml.Package.Capabilities.AppendChild($newNode)
$xml.Save($file)
結果(縮短)
. . .
<Capabilities>
<Capability Name="internetClient" />
<Capability Name="internetClientServer" />
<Capability Name="privateNetworkClientServer" />
<uap:Capability Name="sharedUserCertificates" />
<uap2:Capability Name="spatialPerception" />
<DeviceCapability Name="webcam" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="gazeinput" />
<rescap:Capability Name="perceptionSensorsExperimental" />
</Capabilities>
</Package>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.