XML元素采用了新的方法

时间:2015-08-13 13:29:10

标签: xml powershell csv

我目前正在创建一个将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>bgomez1@sogou.com</email>
        <country>Portugal</country>
        <ip_address
>165.233.249.20</ip_address
>
    </Person>

有没有办法防止最后一个元素占用新行?我已经尝试运行addElementToDoc()函数而不编写IP地址并且格式化很好,它只在编写器写入ip地址和值时才会发生。

有没有我错过的东西?或者我应该设置/设置不正确的格式参数?

1 个答案:

答案 0 :(得分:2)

这里有一个数组越界错误:

for($i=0;$i -le $headerArr.Length; $i++)
{
    $XmlWriter.WriteElementString($headerArr[$i], $valueArr[$i])
}

由于$i(小于或等于,即&lt; =),0$headerArr.Length-le。这可能会导致意外输出。

请改用:

for($i=0; $i -lt $headerArr.Length; $i++)
{
    $XmlWriter.WriteElementString($headerArr[$i], $valueArr[$i])
}