J'ai un document XML que j'aimerais pouvoir analyser à l'aide de l'analyseur DOM XMLDocument. Je sais que je peux utiliser XPath pour analyser les éléments du document qui m'intéressent. Cependant, je préférerais pouvoir analyser certains éléments avec un XPath et traiter ces éléments comme un document à part entière. Voici un exemple trivial à clarifier.

import Foundation

class XMLDocumentExample {
    let xml = """
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Report xmlns="urn:com.conorgriffin/support/Report">
        <name>SpreadsheetGeneration</name>
        <reference-id>98ecd186d83301b418add9fb2006937f</reference-id>
        <common-id>F5S|242C11A2|5F9B870E</common-id>
        <customer>customer1</customer>
        <job-integration>
            <integration>load-data</integration>
            <id>675573850</id>
        </job-integration>
        <job-integration>
            <integration>generate-spreadsheet</integration>
            <id>136683540</id>
        </job-integration>
    </Report>
    """

    func parse() {
        do {
            let doc = try XMLDocument.init(xmlString: xml, options: [])
            let name = try doc.nodes(forXPath: "/Report/name")[0].stringValue
            let referenceID = try doc.nodes(forXPath: "/Report/reference-id")[0].stringValue
            let commonID = try doc.nodes(forXPath: "/Report/common-id")[0].stringValue
            let customer = try doc.nodes(forXPath: "/Report/customer")[0].stringValue
            let jobs = try doc.nodes(forXPath: "/Report/job-integration")
        } catch {
            print(error)
        }
    }
}

Alors maintenant, j'ai quelques chaînes extraites des nœuds enfants de l'élément supérieur Report, j'ai également un tableau de XMLNode dans la variable jobs. J'aimerais passer cette variable jobs à une autre fonction et utiliser XPath pour obtenir les détails internes de chaque travail. Je ne veux pas avoir à inclure l'élément Report dans les XPaths, par ex. "/Report/job-integration/integration".

Comment puis-je traiter chaque nœud job-integration comme un document à part entière afin de pouvoir l'analyser avec des XPath relatifs à l'élément job-integration tel que "/integration" ou "/id" ?

0
conorgriffin 12 nov. 2020 à 18:26

1 réponse

Meilleure réponse

J'ai compris cela, il s'avère que j'y étais presque mais que je n'utilisais pas correctement XPath.

Une fois que j'ai passé un nœud job-integration de mon code initial ci-dessus dans la fonction ci-dessous, je pouvais utiliser le caractère . au début de la requête XPath pour indiquer que je voulais un résultat relatif au nœud actuel.

func build(node: XMLNode) -> JobIntegration {
        do {
            let integrationName = try node.nodes(forXPath: "./integration/text()")[0]
            let integrationId = try node.nodes(forXPath: "./id/text()")[0]
            return JobIntegration(id: integrationId, integration: integrationName)
        } catch {
            print(error)
        }
    }
0
conorgriffin 12 nov. 2020 à 19:50