处理由powershell

时间:2018-03-14 05:23:02

标签: xml powershell wix

我正在尝试使用powershell创建xml文件,并在我的第二层节点中添加一个空xmlns=""。谷歌认为这是因为父母和孩子之间的命名空间不同,我怎样才能在生成时使它们相同?

我的powershell代码位于

之下
$gNamespace = "http://schemas.microsoft.com/wix/2006/wi"
$xmlFilePath = "PATH_TO_XML_FILE"
$xmlWriter = New-Object System.XMl.XmlTextWriter($xmlFilePath, $Null)
$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$XmlWriter.IndentChar = "`t"
$xmlWriter.WriteStartDocument()
$xmlWriter.WriteStartElement("Wix", $gNamespace)
$xmlWriter.WriteEndElement()
$xmlWriter.WriteEndDocument()
$xmlWriter.Finalize
$xmlWriter.Flush()
$xmlWriter.Close()

$xmlDoc = [System.Xml.XmlDocument](Get-Content $xmlFilePath);
$nsmgr = new-object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$nsmgr.AddNamespace("wixns", $gNamespace)

$xmlDoc = [System.Xml.XmlDocument](Get-Content $xmlFilePath)
$productNode = $xmlDoc.CreateElement("Product")
$xmlDoc.SelectSingleNode("//wixns:Wix", $nsmgr).AppendChild($productNode)
$productNode.SetAttribute("Id", "ProductIdHere")

上面的代码生成以下xml

<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="ProductIdHere" xmlns=""/>
</Wix>

我的预期结果是

<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="ProductIdHere"/>
</Wix>

如何在PowerShell生成xml时使父级和子级之间的命名空间相同?并选择具有命名空间的正确节点?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在PowerShell中有更简单的方法可以做到这一点。看一下这个例子here

从这里你可以创建你的XML,例如如下:

[xml]$doc = New-Object System.Xml.XmlDocument
$dec = $doc.CreateXmlDeclaration("1.0", $null, $null)
$doc.AppendChild($dec)  
$root = $doc.CreateNode("element","WiX", "http://schemas.microsoft.com/wix/2006/wi")
$c = $doc.CreateNode("element", "Product", "http://schemas.microsoft.com/wix/2006/wi")
$c.SetAttribute("Id", "ProductIdHere") | Out-Null
$root.AppendChild($c) | Out-Null
$doc.AppendChild($root) | Out-Null
$doc.Save($pathToSave)

当然,您也可以将基本结构存储在字符串或文件中,然后将其转换为[xml],然后执行一些操作。