如何在PowerShell中自动创建XML的新元素?

时间:2019-12-04 09:55:58

标签: xml powershell

我有一个文本文件,其内容如下:

123asdf
abdfeef
22343sf
dfafdsf

此文件的内容正在更改。

我想创建一个xml文件,其中一个元素包含文本文件内容。

我尝试过,但是所有内容都在同一个元素中:

$Getfile = Get-Content .\DeleteFile.txt
$TimeStamp = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId(
        (Get-Date), 'Taipei Standard Time')
$delete_file = @"
<?xml version="1.0" encoding="UTF-8"?>
    <Handling>
        <Deleted>
            <1>$Getfile</1>
        </Deleted>
        <TimeStamp>$TimeStamp</TimeStamp>
    </Handling>
"@
$delete_file | Out-File .\DeleteFile.xml

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Handling>
    <Deleted>
        <1>123asdf abdfeef 22343sf dfafdsf</1>
    </Deleted>
    <TimeStamp>12/04/2019 17:49:06</TimeStamp>
</Handling>

我的期望是输出将是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<Handling>
    <Deleted>
        <1>123asdf</1>
        <2>abdfeef</2>
        <3>22343sf</3>
        <4>dfafdsf</4>
    </Deleted>
    <TimeStamp>12/04/2019 17:49:06</TimeStamp>
</Handling>

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

由于您没有创建新的XML元素,因此内容将包含在同一元素中。要添加元素,请创建XML对象并使用其CreateElementAppendChild方法。像这样

# Skeleton document that is filled later
[xml]$d = @'
<Handling>
<Deleted />
<TimeStamp />
</Handling>
'@

# Dummy data, read these from a file instead    
$data = @('123asdf', 'abdfeef', '22343sf', 'dfafdsf')

# XPath selects the node under which new elements are added
$n = $d.SelectSingleNode('/Handling/Deleted')

# Loop through input data    
for($i=0; $i -lt $data.length; ++$i) {
    # Create new element, Element name is from loop counter
    $e = $d.CreateElement(($i+1).ToString())
    $e.InnerText = $data[$i]
    # Add the new node into document
    $n.AppendChild($e) | out-null
}
# Display the results.
$d.save([console]::out)

输出:

<?xml version="1.0" encoding="ibm850"?>
<Handling>
  <Deleted>
    <1>123asdf</1>
    <2>abdfeef</2>
    <3>22343sf</3>
    <4>dfafdsf</4>
  </Deleted>
  <TimeStamp />
</Handling>

答案 1 :(得分:2)

vonPryz' helpful answer利用.NET XmlDocument API来构建文档。

您尝试过的使用expandable string(字符串插值)的解决方案, 是可能的,即通过包含枚举 private List<List<String>> stoxxFileReader(String file, int column) throws IOException { List<List<String>> allLines = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(file))) { br.readLine(); String line = null; while ((line = br.readLine()) != null) { String[] values = line.split(","); allLines.add(Arrays.asList(values)); } } return allLines; 数组的语句并构造编号的XML通过子表达式运算符$Getfile从其元素中选择元素。

两个腔室

  • XML元素名称不能以 digit 开头,因此尝试创建名为$(...)1,...的元素将导致无效 XML文档。因此,下面的代码改为使用2e1,...。

  • 代码使用e2保存输出文件,以确保使用的字符编码UTF-8与XML声明(Set-Content -Encoding Utf8)中指定的编码匹配。

    • 至少在 Windows PowerShell encoding="UTF-8" / Out-File中,将导致UTF-16LE编码。
      但是,PowerShell [Core] v6 +始终默认为无BOM的UTF-8。
    • 在Windows PowerShell中,>使用BOM表创建一个UTF-8文件 ,与PowerShell [Core] v6 +不同。在Windows PowerShell中,您不能选择退出 BOM。在PowerShell [Core] v6 +中,您可以使用Set-Content -Encoding Utf8 选择加入
-Encoding utf8BOM