我当前正在创建一个脚本,用于将 CSV 文件转换为 XML 文档。我有以下内容:
function writeDoc(){
$XmlWriter.WriteStartElement("RootElement")
foreach($test in $csvFile)
{
$valueArr+= $test.id
$valueArr+=$test.first_name
$valueArr+= $test.last_name
$valueArr+= $test.email
$valueArr+= $test.country
$valueArr+= $test.ip_address
addElementToDoc("Person")
$valueArr = @()
}
# close root
$XmlWriter.WriteEndElement()
# close doc
$XmlWriter.WriteEndDocument()
$XmlWriter.Finalize
$XmlWriter.flush()
$XmlWriter.Close()
}
function addElementToDoc($elName)
{
$XmlWriter.WriteStartElement($elName)
for($i=0;$i -le $headerArr.Length; $i++)
{
$XmlWriter.WriteElementString($headerArr[$i], $valueArr[$i])
}
$XmlWriter.WriteEndElement()
}
function setupXmlWriter()
{
# set formatting
$XmlWriter.formatting = "Indented"
$XmlWriter.Indentation = "4"
#write xml declaration
$XmlWriter.WriteStartDocument()
#set the xsl
$XSLPropText = "type='text/xsl' href='style.xsl'"
$XmlWriter.WriteProcessingInstruction("xml-stylesheet", $XSLPropText)
}
csv 包含列 id、fname、lname、email、coutnry 和 ip 地址。转换文档时,一切正常,直到到达 IP 地址。完成的元素最终看起来像这样:
<Person>
<id>2</id>
<first_name>Bonnie</first_name>
<last_name>Gomez</last_name>
<email><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="197b7e76747c6328596a767e766c377a7674" rel="noreferrer noopener nofollow">[email protected]</a></email>
<country>Portugal</country>
<ip_address
>165.233.249.20</ip_address
>
</Person>
有没有办法防止最后一个元素换行?我尝试在不写入 ip 地址的情况下运行 addElementToDoc() 函数,并且格式很好,它仅在作者写入 ip 地址和值时发生。
我是不是漏掉了什么?或者也许我应该设置/设置不正确的格式参数?
最佳答案
这里有一个数组越界错误:
for($i=0;$i -le $headerArr.Length; $i++)
{
$XmlWriter.WriteElementString($headerArr[$i], $valueArr[$i])
}
由于$i
从0
运行到$headerArr.Length
,因为-le
(更少或等于,即 <=)。这可能会导致意外的输出。
改用这个:
for($i=0; $i -lt $headerArr.Length; $i++)
{
$XmlWriter.WriteElementString($headerArr[$i], $valueArr[$i])
}
关于XML 元素换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989665/