PowerShell, объединяющий несколько файлов XML

Создайте расширение для каждого класса и дайте ему реализовать Encodable. Что-то вроде этого для Lot

extension Lot: Encodable {
  enum CodingKeys: String, CodingKey {
    case id
    case quantity
    case expiration
    case quantity_packages
  }

  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(quantity, forKey: . quantity)
    try container.encode(expiration, forKey: . expiration)
    try container.encode(quantity_packages, forKey: . quantity_packages)
}

и для Билла, обратите внимание, что я конвертирую lots из NSSet в Array

extension Bill: Encodable {
  enum CodingKeys: String, CodingKey {
    case id
    case name
    case lots
  }

  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(name, forKey: .name)
    if let array = lots?.allObjects as? [Lot] {
        try container.encode(array, forKey: .lots)
    } // else Not sure what to do here, maybe use an empty array?
  }
}

Я не смог чтобы проверить это правильно, но я надеюсь, что это поможет.

2
задан Ansgar Wiechers 19 January 2019 в 23:59
поделиться

1 ответ

Ваш импорт идет в неправильном направлении. Вы импортируете новый созданный вами XML-документ ($xml) в XML-документ, загруженный из XML-файла. Если вы запустите $newxml.Save([Console]::Out), вы увидите узел <Packages /> прямо перед закрытием </package>.

<package>
    <Application>Java</Application>
    <Version>8.0.2010.9</Version>
    <InstallType>Install</InstallType>
    <Installers>
        ...
    </Installers>
    <Packages />       <!-- right here -->
</package>

Это утверждение импортирует $newxml, как вы хотели:

$xml.ImportNode($newxml.get_DocumentElement(), $true) | Out-Null

, но вы сразу отбрасываете результат (Out-Null), а затем выполняете импорт в обратном направлении:

$newNode = $newxml.ImportNode($xml.get_DocumentElement(), $true)

Это будет делать то, что вы хотите:

$path = 'D:\Desktop\AutoInstall\Packages\Java v8u201\package.xml'

# create new XML document with <Packages> root node
$xml = New-Object Xml
$xml.AppendChild($xml.CreateElement('Packages')) | Out-Null

# load package XML from file and import it into $xml
$package = New-Object Xml
$package.Load($path)
$imported = $xml.ImportNode($package.DocumentElement, $true)
$xml.DocumentElement.AppendChild($imported) | Out-Null

$xml.Save([Console]::Out)
0
ответ дан Ansgar Wiechers 19 January 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: