【问题标题】:Creating XML Elements in PowerShell that inherit namespace prefix from parent node在 PowerShell 中创建从父节点继承命名空间前缀的 XML 元素
【发布时间】:2018-01-16 15:08:32
【问题描述】:

我正在尝试使用 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>

任何帮助将不胜感激!

【问题讨论】:

  • 如果将$doc.CreateElement("int:Date",$null) 替换为$doc.CreateElement("int:Date",$VQ5INTX) 会发生什么? $null 一眼看上去就明确表示“不要在此元素上使用命名空间”。
  • 这似乎已经做到了,我可以发誓我厌倦了我尝试过的许多其他事情!,谢谢! :)

标签: xml powershell


【解决方案1】:

虽然前缀的定义可以被子节点继承,但是每个子节点仍然需要在那个命名空间中指定。

目前,您明确要求&lt;Date&gt; 元素不在任何命名空间中:

$doc.CreateElement("int:Date",$null)

.net 类假设您错误地输入了int:,因为没有命名空间中的元素没有前缀。

相反,您需要指定&lt;Date&gt; 元素位于http://example1 命名空间中:

$doc.CreateElement("int:Date",$VQ5INTX)

如果实现是智能的,它会注意到前缀 int 已经绑定到该命名空间,并避免重复 xmlns:int 属性(这会不整洁,但不会显着改变文档)。

【讨论】:

    【解决方案2】:

    要使用命名空间的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多