使用 Powershell 将子元素添加到 XML 元素
Add Child Element To XML Element using Powershell
我有一个 XML 文档,我正在循环浏览并在文件存在时下载该文件并将其保存到磁盘。
我想更新 XML 文件以包含我保存数据的位置。我怎样才能最好地做到这一点?
XML 文件示例:
<Invoices xmlns="http://example.com/">
<invoice>
<ContractorName>TEST contractor</ContractorName>
<Invoice_Number>12345</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>100.00</Invoice_Amount>
<Invoice_Hyperlink>https://example.com/path/files/file.pdf</Invoice_Hyperlink>
</invoice>
<invoice>
<ContractorName>TEST contractor 2</ContractorName>
<Invoice_Number>98765</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>1000.00</Invoice_Amount>
</invoice>
</invoices>
我的脚本如下,用于遍历 XML 数据并在本地保存文件。
$Invoicesfile = "D:\Download\invoices.xml"
[xml]$Invoice = Get-Content $Invoicesfile -Raw
$InvoiceDestinationDir = "D:\Invoices_Downloaded\"
foreach ($r in $Invoice.Invoices.invoice)
{
If($r.Invoice_Hyperlink -ne $null){
$Directory = $InvoiceDestinationDir + $r.ContractorName + "\"+ $InvoiceDate.ToString('yyyy') + "\" + $InvoiceDate.ToString('MM-MMM') + "\" + $InvoiceDate.ToString('dd')
#Test if destination directory exists and create it if it doesn't
if (!(Test-Path $Directory))
{
New-Item $Directory -type directory | Out-Null
}
#set destination to destination directory and files name consisting of Jobcode,
$destination = $Directory +"\"+ $r.Invoice_Number +"_" + $r.Invoice_Date + $r.Invoice_Hyperlink.SubString($r.Invoice_Hyperlink.LastIndexOf('.'))
Invoke-WebRequest -Uri $r.Invoice_Hyperlink -OutFile $destination
}
}
我找到的所有例子似乎都说使用 CreateElement
方法,下面的例子,但我无法让它工作,因为上面例子中的 $r
是 System.Xml.XmlLinkedNode
CreateElemnt
似乎仅适用于 System.Xml.XmlNode
,即 $Inovices
,但我希望该元素位于 $Invoice.Invoices.invoice
内
[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.DocumentElement.AppendChild($child)
任何建议都是 appreciated.The 我要寻找的结果是使用以下内容保存上述文件。
<Invoices xmlns="http://example.com/">
<invoice>
<ContractorName>TEST contractor</ContractorName>
<Invoice_Number>12345</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>100.00</Invoice_Amount>
<Invoice_Hyperlink>https://example.com/path/files/file.pdf</Invoice_Hyperlink>
<Local_File>D:\Invoices_Downloaded345_2017-05-20.pdf</Local_File>
</invoice>
<invoice>
<ContractorName>TEST contractor 2</ContractorName>
<Invoice_Number>98765</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>1000.00</Invoice_Amount>
</invoice>
</invoices>
您找到的代码段工作正常。
$Invoice.Invoices.Invoice
是一个包含 XmlLinkedNodes
的数组
在 foreach 循环之前将 CreateElement()
与 $Invoice
一起使用。
$Invoicesfile = "D:\Download\invoices.xml"
[xml]$Invoice = Get-Content $Invoicesfile -Raw
$InvoiceDestinationDir = "D:\Invoices_Downloaded\"
$child = $Invoice.CreateElement("Local_File")
foreach ($r in $Invoice.Invoices.Invoice){...}
在您的 foreach 中,您可以将 $child
附加到您实际处理的节点上
If($r.Invoice_Hyperlink -ne $null){
$r.appendchild($child)
$InvoiceDate = [datetime]::ParseExact($r.Invoice_Date, 'yyyy-MM-dd', $null)
如您所见,我从您的 xml 中解析了日期,以便能够使用 $InvoiceDate.ToString()
方法
构建您的 $destination
-Path 后,您可以使用 $r.Local_File = $destination
将该路径分配给您的新节点
我有一个 XML 文档,我正在循环浏览并在文件存在时下载该文件并将其保存到磁盘。 我想更新 XML 文件以包含我保存数据的位置。我怎样才能最好地做到这一点?
XML 文件示例:
<Invoices xmlns="http://example.com/">
<invoice>
<ContractorName>TEST contractor</ContractorName>
<Invoice_Number>12345</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>100.00</Invoice_Amount>
<Invoice_Hyperlink>https://example.com/path/files/file.pdf</Invoice_Hyperlink>
</invoice>
<invoice>
<ContractorName>TEST contractor 2</ContractorName>
<Invoice_Number>98765</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>1000.00</Invoice_Amount>
</invoice>
</invoices>
我的脚本如下,用于遍历 XML 数据并在本地保存文件。
$Invoicesfile = "D:\Download\invoices.xml"
[xml]$Invoice = Get-Content $Invoicesfile -Raw
$InvoiceDestinationDir = "D:\Invoices_Downloaded\"
foreach ($r in $Invoice.Invoices.invoice)
{
If($r.Invoice_Hyperlink -ne $null){
$Directory = $InvoiceDestinationDir + $r.ContractorName + "\"+ $InvoiceDate.ToString('yyyy') + "\" + $InvoiceDate.ToString('MM-MMM') + "\" + $InvoiceDate.ToString('dd')
#Test if destination directory exists and create it if it doesn't
if (!(Test-Path $Directory))
{
New-Item $Directory -type directory | Out-Null
}
#set destination to destination directory and files name consisting of Jobcode,
$destination = $Directory +"\"+ $r.Invoice_Number +"_" + $r.Invoice_Date + $r.Invoice_Hyperlink.SubString($r.Invoice_Hyperlink.LastIndexOf('.'))
Invoke-WebRequest -Uri $r.Invoice_Hyperlink -OutFile $destination
}
}
我找到的所有例子似乎都说使用 CreateElement
方法,下面的例子,但我无法让它工作,因为上面例子中的 $r
是 System.Xml.XmlLinkedNode
CreateElemnt
似乎仅适用于 System.Xml.XmlNode
,即 $Inovices
,但我希望该元素位于 $Invoice.Invoices.invoice
[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.DocumentElement.AppendChild($child)
任何建议都是 appreciated.The 我要寻找的结果是使用以下内容保存上述文件。
<Invoices xmlns="http://example.com/">
<invoice>
<ContractorName>TEST contractor</ContractorName>
<Invoice_Number>12345</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>100.00</Invoice_Amount>
<Invoice_Hyperlink>https://example.com/path/files/file.pdf</Invoice_Hyperlink>
<Local_File>D:\Invoices_Downloaded345_2017-05-20.pdf</Local_File>
</invoice>
<invoice>
<ContractorName>TEST contractor 2</ContractorName>
<Invoice_Number>98765</Invoice_Number>
<Invoice_Date>2017-05-20</Invoice_Date>
<Invoice_Amount>1000.00</Invoice_Amount>
</invoice>
</invoices>
您找到的代码段工作正常。
$Invoice.Invoices.Invoice
是一个包含 XmlLinkedNodes
在 foreach 循环之前将 CreateElement()
与 $Invoice
一起使用。
$Invoicesfile = "D:\Download\invoices.xml"
[xml]$Invoice = Get-Content $Invoicesfile -Raw
$InvoiceDestinationDir = "D:\Invoices_Downloaded\"
$child = $Invoice.CreateElement("Local_File")
foreach ($r in $Invoice.Invoices.Invoice){...}
在您的 foreach 中,您可以将 $child
附加到您实际处理的节点上
If($r.Invoice_Hyperlink -ne $null){
$r.appendchild($child)
$InvoiceDate = [datetime]::ParseExact($r.Invoice_Date, 'yyyy-MM-dd', $null)
如您所见,我从您的 xml 中解析了日期,以便能够使用 $InvoiceDate.ToString()
方法
构建您的 $destination
-Path 后,您可以使用 $r.Local_File = $destination