Первый пост здесь - откровенно немного напуган:)
У меня есть каталог с различным количеством .xml-файлов с аналогичным типом контента.Мне нужно создать новый .xml-файл и сохранить все данные в элементе 'order', а для нового файла мне нужно объявление, отметка времени (из любого из исходных файлов, предпочтительно самых старых, которые существуют в 'Transfer/header/timestamp'-element).
Я попытался скопировать некоторые коды, которые я нашел на SO, что похоже на мою проблему, например, «Разделить один файл на несколько» и безуспешно перевернуть их.Без образования я пытаюсь учиться копировать / редактировать, и иногда это получается, но на этот раз это не так.
Вот часть моего исходного файла:
<?xml version="1.0" encoding="iso-8859-1"?>
<transfer id="OrderXML" version="1.14">
<header>
<timestamp>2019-09-17T17:14:27</timestamp>
<timestampTicks>637043372672652077</timestampTicks>
<sender>Company A</sender>
<receiver>Company B</receiver>
</header>
<order>
<message>
<messageId>34357725</messageId>
<messageType>new</messageType>
<response>false</response>
</message>
<identification>
<externalOrderId>25025685</externalOrderId>
<externalOrderSubId />
<internalOrderId>11203757</internalOrderId>
<internalOrderSubId>15726565</internalOrderSubId>
<consignmentOrderId />
</identification>
<serviceData>
<agreementCode />
<serviceCode>Home Delivery 18-22</serviceCode>
<vehicleCode>Distribution</vehicleCode>
</serviceData>
<customer>
<customerCode>7602</customerCode>
<customerNumber>7602</customerNumber>
</customer>
</order>
</transfer>
Мой кодВозможно, он полон синтаксиса и логических ошибок, но то, что я в основном пытался выполнить, можно увидеть в моем коде ниже.
# Declare folder
$directory = "c:\import"
# Declare start of new XML-file
[xml]$newFile = New-Object System.Xml.XmlDocument
# Create declaration
$dec = $newFile.CreateXmlDeclaration("1.0","iso-8859-1",$null)
# Add root-element 'transfer'
$root = $newFile.CreateNode("element","transfer",$null)
$newFile.AppendChild($root) | Out-Null
# TODO: Find a way to add transfer/header from the oldest file from $directory
# Load all xml-files from Directory
$content = Get-ChildItem -Path $directory -Filter *.xml -File| ForEach-Object {
# Grab all data, starting from //order. Add <order></order> per ForEach-Object.
$content = $newFile.CreateNode("element","order",$null)
# Load content using Get-Content-current file
[xml]$newFile = Get-Content $_.FullName
# Select all data from //order
$addOrder = $newFile.SelectNodes("//order")
# Append to existing file
$newFile.AppendChild($addOrder)
}
# Save file
$newFile.Save("c:\Export\Export.xml")
Ожидаемый результат, но сжатый для удобства чтения, но я хочу сохранить все данные изисточники, как это:
<?xml version="1.0" encoding="iso-8859-1"?>
<transfer id="OrderXML" version="1.14">
<header>
<timestamp>2019-09-17T17:14:27</timestamp>
<timestampTicks>637043372672652077</timestampTicks>
<sender>Company A</sender>
<receiver>Company B</receiver>
</header>
<order>
<message>
<messageId>34357725</messageId>
<messageType>new</messageType>
<response>false</response>
</message>
</order>
<order>
<message>
<messageId>34357726</messageId>
<messageType>packagescan</messageType>
<response>false</response>
</message>
</order>
<order>
<message>
<messageId>34357727</messageId>
<messageType>status</messageType>
<response>false</response>
</message>
</order>
<order>
<message>
<messageId>34357728</messageId>
<messageType>status</messageType>
<response>false</response>
</message>
</order>
</transfer>
Сообщение об ошибке от Powershell, возможно, синтаксическая ошибка, потому что я не совсем понимаю, как его использовать:
Cannot convert argument "0", with value: "System.Xml.XPathNodeList", for "AppendChild" to type "System.Xml.XmlNode": "Cannot convert the "System.Xml.XPathNodeList" va
lue of type "System.Xml.XPathNodeList" to type "System.Xml.XmlNode"."
At C:\Users\Administrator\Desktop\saxon\MergeXML.ps1:28 char:5
+ $newFile.AppendChild($addOrder)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
Cannot convert argument "0", with value: "System.Xml.XPathNodeList", for "AppendChild" to type "System.Xml.XmlNode": "Cannot convert the "System.Xml.XPathNodeList" va
lue of type "System.Xml.XPathNodeList" to type "System.Xml.XmlNode"."
At C:\Users\Administrator\Desktop\saxon\MergeXML.ps1:28 char:5
+ $newFile.AppendChild($addOrder)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
Любая помощь, указывающая мне в правильном направлениитак что я могу достичь своей цели очень сильно ценится!