我试图使用PowerShell创建一个xml文档,我的问题是已经附加到父级的元素不会继承声明名称空间前缀,但是在玩游戏时,我已经设法得到它有前缀,但只有它包括另一个xmlns =""。
$UserName = $env:UserName
$OutputPath = "C:\Users\" + $UserName +"\Desktop\Generator\Output\"
$OutputXML = $OutputPath + "Test_File_1.xml"
#Namespace URIs
$VQ5NSX = "http://example2"
$VQ5INTX ="http://example1"
[xml]$Doc = New-Object System.Xml.XmlDocument
$dec = $Doc.CreateXmlDeclaration("1.0","UTF-8",$null)
$doc.AppendChild($dec)
$root = $doc.CreateNode("element","ns:responsefile", $VQ5NSX)
$int = $doc.CreateNode("element", "int:IntegrationHeader",$VQ5INTX)
$IntDt = $doc.CreateElement("int:Date",$null)
$IntDt.InnerText = "Date Text"
$Int.AppendChild($IntDt) | Out-Null
$IntId = $doc.CreateElement("Identification")
$IntAppID = $doc.CreateElement("ApplicationId")
$IntAppIDtxt = $Doc.CreateTextNode("App Id Text")
$IntAppId.AppendChild($IntAppIDtxt)|Out-Null
$IntId.AppendChild($IntAppID)|Out-Null
$IntTransID = $doc.CreateElement("TransactionId")
$IntTransIDtxt = $Doc.CreateTextNode("Tran Id Text")
$IntTransID.AppendChild($IntTransIDtxt) |Out-Null
$IntId.AppendChild($IntTransID) |Out-Null
$Int.AppendChild($IntId) |Out-Null
$root.AppendChild($int)|Out-Null
$Res = $doc.CreateNode("element","ns:ResponseItem", $null)
$ItemDetail = $doc.CreateElement("ns:Item1")
$ItemDetail = $doc.CreateTextNode("Item one text")
$Res.AppendChild($ItemDetail)|Out-Null
$root.AppendChild($res)|Out-Null
$doc.AppendChild($root) |Out-Null
$doc.save($OutputXML)
这将生成以下输出;
<?xml version="1.0" encoding="UTF-8"?>
<ns:responsefile xmlns:ns="http://example2">
<int:IntegrationHeader xmlns:int="http://example1">
<Date>Date Text</Date>
<Identification>
<ApplicationId>App Id Text</ApplicationId>
<TransactionId>Tran Id Text</TransactionId>
</Identification>
</int:IntegrationHeader>
<ResponseItem>Item one text</ResponseItem>
</ns:responsefile>
但我需要它来生成此输出;
<?xml version="1.0" encoding="UTF-8"?>
<ns:responsefile xmlns:ns="http://example2">
<int:IntegrationHeader xmlns:int="http://example1">
<int:Date>Date Text</Date>
<int:Identification>
<int:ApplicationId>App Id Text</int:ApplicationId>
<int:TransactionId>Tran Id Text</int:TransactionId>
</int:Identification>
</int:IntegrationHeader>
<ns:ResponseItem>Item one text</ns:ResponseItem>
</ns:responsefile>
非常感谢任何帮助!
答案 0 :(得分:1)
对于使用命名空间XML,请使用命名空间管理器。
[xml]$doc = @'
<?xml version="1.0" encoding="UTF-8"?>
<ns:responsefile xmlns:ns="http://example2">
<int:IntegrationHeader xmlns:int="http://example1">
</int:IntegrationHeader>
<ResponseItem>Item one text</ResponseItem>
</ns:responsefile>
'@
$int_ns = 'http://example1'
$nsm = New-Object Xml.XmlNamespaceManager($doc.NameTable)
$nsm.AddNamespace('int', $int_ns)
在将新元素附加到父节点之前,在预期的命名空间中创建新元素:
$Int = $doc.SelectSingleNode('//int:IntegrationHeader', $nsm)
$IntDt = $doc.CreateElement('int', 'Date', $int_ns)
$IntDt.InnerText = "Date Text"
$Int.AppendChild($IntDt) | Out-Null
答案 1 :(得分:0)
虽然前缀的定义可以由子节点继承,但仍然需要在该命名空间中指定每个子节点。
目前,您明确要求<Date>
元素不在任何名称空间中:
$doc.CreateElement("int:Date",$null)
.net类假设您错误地放入了int:
,因为没有名称空间中的元素没有前缀。
相反,您需要指定<Date>
元素位于http://example1
命名空间中:
$doc.CreateElement("int:Date",$VQ5INTX)
如果实现是智能的,它会注意到前缀int
已经绑定到该命名空间,并且避免重复xmlns:int
属性(这将是不整洁的,但不会显着更改文档)