Создайте расширение для каждого класса и дайте ему реализовать 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?
}
}
Я не смог чтобы проверить это правильно, но я надеюсь, что это поможет.
Ваш импорт идет в неправильном направлении. Вы импортируете новый созданный вами 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)