繁体   English   中英

如何使用 XmlWriter() 在 Powershell 中正确创建此 xml 文件?

[英]How can I properly create this xml file in Powershell using XmlWriter()?

我想在 powershell 中使用 XmlWriter() 创建一个这样的 xml 文档,但我遇到了麻烦,这是预期的输出:

<Item version="1">
  <Name>Myproject</Name>
  <GUID>4821CC01-CDB0-4FD7-9F1E-0B1EDF32ACE9</GUID>
</Item>

当前代码:

$xmlsettings = New-Object System.Xml.XmlWriterSettings
$xmlsettings.Indent = $true
$XmlWriter = [System.XML.XmlWriter]::Create("$PSScriptRoot\Myproject.xml", $xmlsettings)

# As mentioned above, I don't want the default output of WriteStartDocument(), so I used this
$xmlWrite.WriteStartElement("Item") 
$xmlWrite.WriteAttributeString("Version", "1.0")
$xmlWriter.WriteElementString("Name",$myProject) # I have a string variable containing the project name

<#From here it throws the error: Exception calling "WriteElementString" with "2" argument(s): "Token StartElement in state EndRootElement would result in an
     | invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if
     | you want to write an XML fragment."#>
$xmlWriter.WriteElementString("GUID",(New-Guid).Guid.ToUpper())
$xmlWriter.WriteEndElement()

$xmlWriter.Flush()
$xmlWriter.Close()

上述代码的错误输出:

<?xml version="1.0" encoding="utf-8"?>
<Name>Myproject</Name>

不知道为什么仍然输出 WriteStartDocument() 的内容,我确定我没有输入错误的代码,这显然没有应用缩进。

有人愿意帮忙吗? 提前致谢!

您当前的代码无法编译,但使用更正的变量名可以正常工作。

如果您需要删除 xml 版本,只需添加$xmlsettings.OmitXmlDeclaration = $true

$myProject = 'Myproject'
$path = "c:\temp\Myproject.xml"

$xmlsettings = New-Object System.Xml.XmlWriterSettings
$xmlsettings.Indent = $true

$xmlWriter = [System.XML.XmlWriter]::Create($path, $xmlsettings)
$xmlWriter.WriteStartElement("Item") 
$xmlWriter.WriteAttributeString("Version", "1.0")
$xmlWriter.WriteElementString("Name",$myProject)
$xmlWriter.WriteElementString("GUID",(New-Guid).Guid.ToUpper())
$xmlWriter.WriteEndElement()

$xmlWriter.Flush()
$xmlWriter.Close()

结果

<?xml version="1.0" encoding="utf-8"?>
<Item Version="1.0">
  <Name>Myproject</Name>
  <GUID>3CA7FBFA-1585-44A1-B4D9-D59E9371FE1B</GUID>
</Item>

这种事情使用XDocument容易得多 您实际上只应该将XmlWriter用于非常定制的 XML。

using namespace System.Xml.Linq;

$doc = [XDocument]::new(
   [XElement]::new("Item",
     [XAttribute]::new("version", "1"),
     [XElement]::new("Name", "Myproject"),
     [XElement]::new("GUID", "4821CC01-CDB0-4FD7-9F1E-0B1EDF32ACE9")
   )
 );

$doc.ToString();
$doc.ToString() | Out-File "$PSScriptRoot\Myproject.xml";

输出

<Item version="1">
  <Name>Myproject</Name>
  <GUID>4821CC01-CDB0-4FD7-9F1E-0B1EDF32ACE9</GUID>
</Item>

试试这个 -> $xmlWriter.WriteElementString("Name","$($myProject)")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM