Как объединить несколько XML-файлов в один в Powershell? - PullRequest
0 голосов
/ 23 сентября 2019

Первый пост здесь - откровенно немного напуган:)

У меня есть каталог с различным количеством .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

Любая помощь, указывающая мне в правильном направлениитак что я могу достичь своей цели очень сильно ценится!

...