gpt4 book ai didi

xml - Powershell空XML元素,格式为一行

转载 作者:行者123 更新时间:2023-12-02 23:34:40 24 4
gpt4 key购买 nike

我需要XML格式与Powershell默认保存它的方式稍有不同。这是一个代码示例:

[xml]$XML = New-Object system.Xml.XmlDocument
$Declaration = $XML.CreateXmlDeclaration("1.0","UTF-8",$null)
$XML.AppendChild($Declaration) > $null

$Temp = $XML.CreateElement('Basket')
$Temp.InnerText = $test
$XML.AppendChild($Temp)

$Temp1 = $XML.CreateElement('Item')
$Temp1.InnerText = ''
$Temp.AppendChild($Temp1)

$XML.save('test.xml')

结果是:
<?xml version="1.0" encoding="UTF-8"?>
<Basket>
<Item>
</Item>
</Basket>

我所需的XML应该如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Basket>
<Item></Item>
</Basket>

这可能吗?

如果我添加 XML.PreserveWhitespace = $true,则所有内容都会以一行结尾。而且元素没有 PreserveWhitespace属性。

我发现的一个解决方案是添加一个空格 $Temp1.InnerText = ' ',然后在第二步中清理代码。但是我想知道是否有技巧让Powershell在一行上输出空元素。
不幸的是,我需要读取XML的目标应用程序将仅接受上述所需的格式。

最佳答案

$Temp1.InnerText = ''

您尝试 来强制XML序列化使用单行<tag></tag>形式而不是自动关闭的<tag />形式,因为-尽管这两种形式都应等效,但是序列化XML(Adobe)的特定使用者仅接受 <tag></tag>形式。

您的尝试基于区分一个真正的空元素-一个没有子节点的元素和一个具有空字符串文本子节点(由 .InnerText = ''隐式创建的)的元素,希望一个有子节点的元素-即使唯一的子节点是空字符串-始终以 <tag>...</tag>形式进行序列化。

您的尝试:

XmlDocument 类型的 .Save()方法(提示您的问题)未将
  • 授予
  • 您遇到的特定行为最终被设计为分类-参见this GitHub issue
  • ,被基于LINQ的 XDocument 类型的.Save()方法授予

  • 因此,您有两个选择:

    解决方法,如果已获得现有的 XmlDocument实例:

    如果您根据 XDocument实例的 XmlDocument属性( .OuterXml)返回的(非 pretty-print 的)XML字符串构造 $XML.OuterXml实例,则假定您保留了显式添加的空-您代码中的字符串子文本节点,即 XDocument:
    # Creates a pretty-printed XML file with the empty elements
    # represented in "<tag></tag>" form from the System.Xml.XmlDocument
    # instance stored in `$XML`.
    ([System.Xml.Linq.XDocument] $XML.OuterXml).Save("$PWD/test.xml")

    尽管这需要额外的一轮序列化和解析,但这是一个简单实用的解决方案。

    如果未将XML DOM对象提供给您,并且您可以选择自己构造它,那么最好将其构造为 <tag></tag>实例开始,如下所示。

    或者,您可以 直接将您的XML文档构造为$Temp1.InnerText = '' :

    首先将文档构造为 XDocument实例:
    # PSv5+ syntax for simplifying type references.
    using namespace System.Xml.Linq

    # Create the XDocument with its declaration.
    $xd = [XDocument]::new(
    # Note: [NullString]::Value is needed to pass a true null value - $null doesn't wor.
    [XDeclaration]::new('1.0', 'UTF-8', [NullString]::Value)
    )

    # Add nodes.
    $xd.Add(($basket = [XElement] [XName] 'Basket'))
    $basket.Add(($item = [XElement] [XName] 'Item'))

    # Add an empty-string child node to the '<Item>' element to
    # force it to serialize as '<Item></Item>' rather than as '<Item />'
    $item.SetValue('')

    # Save the document to a file.
    $xd.Save("$PWD/test.xml")

    关于xml - Powershell空XML元素,格式为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58246585/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com