我有一个文本文件,其内容如下:
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>
有人可以帮我吗?
答案 0 :(得分:3)
由于您没有创建新的XML元素,因此内容将包含在同一元素中。要添加元素,请创建XML对象并使用其CreateElement
和AppendChild
方法。像这样
# 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文档。因此,下面的代码改为使用2
,e1
,...。
代码使用e2
保存输出文件,以确保使用的字符编码UTF-8与XML声明(Set-Content -Encoding Utf8
)中指定的编码匹配。
encoding="UTF-8"
/ Out-File
中,将导致UTF-16LE编码。>
使用BOM表创建一个UTF-8文件 ,与PowerShell [Core] v6 +不同。在Windows PowerShell中,您不能选择退出 BOM。在PowerShell [Core] v6 +中,您可以使用Set-Content -Encoding Utf8
选择加入。-Encoding utf8BOM