XMLDocument-Skriptobjekt

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 3 Minuten Lesedauer
  • Ein JavaScript-Objektwrapper zum Analysieren und Extrahieren von XML-Daten aus einem XML-Dokument (Zeichenfolge).

    Verwenden Sie diese Javascript-Klasse, um ein Objekt aus einer XML-Zeichenfolge zu instanziieren, normalerweise einem Rückgabewert eines Webserviceaufrufs oder der XML-Payload der ECC-Warteschlange. Wenn Sie das XMLDocument-Objekt in einer JavaScript-Business Rule verwenden, können Sie Werte direkt aus den XML-Elementen und -Attributen abfragen.

    Konstruktor

    Der Konstruktor eines Skriptobjekts erstellt eine neue Instanz des zu verwendenden Objekts.
    var xmlString = "<test>" +
                    "  <one>" +
                    "    <two att=\"xxx\">abcd1234</two>" +
                    "    <three boo=\"yah\" att=\"yyy\">1234abcd</three>" +
                    "    <two>another</two>" +
                    "  </one>" +
                    "  <number>1234</number>" +
                    "</test>";
    
    var xmldoc = new XMLDocument(xmlString);
    Um eine XML-Analyse einer XML-Zeichenfolge durchzuführen, deren Namespace qualifiziert ist, geben Sie „true“ als zweites Argument für den XMLDocument-Konstruktor an. Im Folgenden finden Sie ein Beispiel für die Analyse und die XML-Zeichenfolge, die die Namespace-Qualifizierung ihrer Elemente enthält.
    var xmlString = "<bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>" +
                      "<bk:title>Cheaper by the Dozen</bk:title>" +
                      "<isbn:number>1568491379</isbn:number>" +
                    "</bk:book>";
    
    var xmldoc = new XMLDocument(xmlString, true); // XML document is name space aware
    

    Knoten und Elemente lokalisieren

    Da wir bereits über das XMLDocument-Objekt verfügen, können die folgenden APIs aufgerufen werden, um Knoten und Elemente des XML-Dokuments zu lokalisieren und Text direkt daraus zu extrahieren. Die Abfragesyntax zum Suchen von Knoten und Attributen basiert auf XPath.
    Hinweis:
    Das XML-Parsing mit diesem Objekt ist nicht für den Namespace geeignet. Dies bedeutet, dass bei Suche eines Knotennamens mit einem Namespace, z. B „<names:myelement>...“, die XPath-Suchzeichenfolge „//meinelement“ lautet.
    Im Folgenden finden Sie Beispiele für das Lokalisieren eines Knotens anhand seines XPath und das Abrufen des Textwerts aus dem resultierenden Knoten.
    var str = xmldoc.getNodeText("//two"); // returns the first occurrence of the node
    // str == "abcd1234"
    
    str = xmldoc.getNodeText("//three");
    // str == "1234abcd"
    
    str = xmldoc.getNodeText("/test/one/*");
    // str == "abcd1234"
    
    str = xmldoc.getNodeInt("//number");
    // str == 1234
    
    In den folgenden Beispielen wird der Knoten anhand von XPath ermittelt und mithilfe der API für Knoten und Elemente werden Attribute und Werte abgerufen.
    var node = xmldoc.getNode("/test/one/two");
    // node.getNodeName() == "two"
    // node.getNodeType() == "1" // 1 == ELEMENT_NODE
    // node.getLastChild().getNodeType() == "3" // 3 == TEXT_NODE
    // node.getLastChild().getNodeValue() == "abcd1234"
    Es können jedoch auch die folgenden Komfortfunktionen verwendet werden, um den Knotennamen und -typ abzurufen
    str = xmldoc.getNodeName("//three");
    // str == "three"
    
    str = xmldoc.getNodeType("//three");
    // str == "1"
    Zudem kann eine Liste mit Knoten abgerufen werden, auf die Sie iterieren oder direkt nach Position zugreifen können.
    var nodelist = xmldoc.getNodes("//one/*"); // two, three, and two
    // nodelist.getLength() == "3"
    // nodelist.item(0).getNodeName() == "two"
    // nodelist.item(1).getNodeName() == "three"
    Das folgende Beispiel zeigt die Analyse einer XML-Zeichenfolge, die mit Namensräumen qualifiziert ist.
    var xmlString = "<bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>" +
                      "<bk:title>Cheaper by the Dozen</bk:title>" +
                      "<isbn:number>1568491379</isbn:number>" +
                    "</bk:book>";
    
    var xmldoc = new XMLDocument(xmlString, true);
    var str = xmldoc.getNodeText("//bk:title"); // returns the first occurence of the node
    gs.log(str);
    
    str = xmldoc.getNodeText("/bk:book/*");
    gs.log(str);
    
    str = xmldoc.getNodeInt("//isbn:number");
    gs.log(str);

    Attributwerte abrufen

    Ein Attribut ist nur eine Erweiterung eines Knotens und verfügt daher über dieselben APIs.

    Das folgende Beispiel zeigt, wie Sie einen Knoten abfragen, um das Attribut nach Position abzurufen.
    node = xmldoc.getNode("//two");
    // node.getAttributes().item(0).getNodeValue() == "xxx"
    
    str = xmldoc.getAttribute("//two", "att");
    // str == "xxx"
    XPath verfügt auch über eine Abfragesyntax, um beispielsweise den Attributknoten direkt zu lokalisieren.
    str = xmldoc.getNodeText("//*[@att=\"yyy\"]");
    // str == "1234abcd"
    
    str = xmldoc.getNode("//@boo").getNodeValue();
    // str == "yah"
    

    Neue Elemente erstellen

    Ein XML-Element kann auf jeder Ebene des XML-Dokuments erstellt werden, sobald es erstellt wurde. Verwenden Sie die Funktion setCurrent, wo das neue Element als untergeordnetes Element erstellt wird, und verwenden Sie die Funktion createElement zum Erstellen des Elements.
    var xmlString = "<test>" +
                    "  <one>" +
                    "    <two att=\"xxx\">abcd1234</two>" +
                    "    <three boo=\"yah\" att=\"yyy\">1234abcd</three>" +
                    "    <two>another</two>" +
                    "  </one>" +
                    "  <number>1234</number>" +
                    "</test>";
    
    var xmldoc = new XMLDocument(xmlString);
    xmldoc.createElement("new", "test"); // creates the new element at the document element level if setCurrent is never called
    xmldoc.createElement("new2"); // calling without a value will create a new element by itself
    
    var el = xmldoc.createElement("new3");
    xmldoc.setCurrent(el); // this is now the parent of any new elements created subsequently using createElement()
    xmldoc.createElement("newChild", "test");
    Das resultierende XML-Dokument sieht folgendermaßen aus:
    <test>
      <one>
        <two att="xxx">abcd1234</two>
        <three boo="yah" att="yyy">1234abcd</three>
        <two>another</two>
      </one>
      <number>1234</number>
      <new>test<new>
      <new2/>
      <new3>
          <newChild>test</newChild>
      </new3>
    </test>