Úprava atribútu XML v prostredí Java

1. Úvod

Jednou z bežných aktivít, keď pracujeme s XML, je práca s jeho atribútmi. V tomto tutoriále preskúmame, ako upraviť atribút XML pomocou jazyka Java.

2. Závislosti

Aby sme mohli spustiť naše testy, budeme musieť pridať JUnit a xmlunit-assertj závislosti na našom projekte Maven:

 org.junit.jupiter test junit-jupiter 5.5.0 
 org.xmlunit xmlunit-assertj 2.6.3 test 

3. Používanie JAXP

Začnime s dokumentom XML:

  [chránené e-mailom] [chránené e-mailom] 

Aby sme to mohli spracovať, urobíme to používať Java API na spracovanie XML (JAXP), ktorý je dodávaný s jazykom Java od verzie 1.4.

Poďme upraviť zákazník atribút a zmeniť jeho hodnotu na nepravdivé.

Najprv musíme postaviť Dokument objekt zo súboru XML a na tento účel použijeme a DocumentBuilderFactory:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", pravda); Vstup dokumentu = továreň .newDocumentBuilder () .parse (resourcePath);

Všimnite si, že aby zakázať spracovanie externej entity (XXE) pre DocumentBuilderFactory trieda, nakonfigurujeme XMLConstants.FEATURE_SECURE_PROCESSING a //apache.org/xml/features/disallow-doctype-decl Vlastnosti. Je dobrým zvykom nakonfigurovať ho pri analýze nedôveryhodných súborov XML.

Po inicializácii nášho vstup objektu, budeme musieť nájsť uzol s atribútom, ktorý by sme chceli zmeniť. Použime výraz XPath na jeho výber:

XPath xpath = XPathFactory .newInstance () .newXPath (); String expr = String.format ("// * [obsahuje (@% s, '% s')]", atribút, oldValue); NodeList nodes = (NodeList) xpath.evaluate (expr, input, XPathConstants.NODESET);

V tomto prípade XPath ohodnotiť metóda nám vráti zoznam uzlov so zhodnými uzlami.

Opakujme zoznam, aby sme zmenili hodnotu:

pre (int i = 0; i <nodes.getLength (); i ++) {Hodnota prvku = (Element) nodes.item (i); value.setAttribute (atribút, newValue); }

Alebo namiesto a pre slučku, môžeme použiť IntStream:

IntStream .range (0, nodes.getLength ()) .mapToObj (i -> (Element) nodes.item (i)) .forEach (value -> value.setAttribute (attribute, newValue));

Teraz použijeme a Transformátor objekt uplatniť zmeny:

TransformerFactory factory = TransformerFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformátor xformer = factory.newTransformer (); xformer.setOutputProperty (OutputKeys.INDENT, "áno"); Výstup zapisovača = nový StringWriter (); xformer.transform (nový DOMSource (vstup), nový StreamResult (výstup));

Ak vytlačíme výkon obsah objektu, dostaneme výsledný XML s zákazník upravený atribút:

  [chránené e-mailom] [chránené e-mailom] 

Môžeme tiež použiť tvrdiťTo metóda XMLUnit, ak ju potrebujeme overiť v teste jednotky:

assertThat (output.toString ()). hasXPath ("// * [contains (@customer, 'false')]" ");

4. Používanie dom4j

dom4j je open-source framework pre spracovanie XML, ktorý je integrovaný do XPath a plne podporuje kolekcie DOM, SAX, JAXP a Java.

4.1. Maven závislosť

Musíme pridať závislosti dom4j a jaxen pom.xml použiť dom4j v našom projekte:

 org.dom4j dom4j 2.1.1 jaxen jaxen 1.2.0 

Viac sa o dom4j môžeme dozvedieť v našom článku Podpora knižníc XML.

4.2. Použitím org.dom4j.Element.addAttribute

dom4j ponúka Element rozhranie ako abstrakcia pre prvok XML. Budeme používať addAttribute spôsob aktualizácie našich zákazník atribút.

Pozrime sa, ako to funguje.

Najprv musíme postaviť Dokument objekt zo súboru XML - tentokrát použijeme a SAXReader:

SAXReader xmlReader = nový SAXReader (); Vstup dokumentu = xmlReader.read (resourcePath); xmlReader.setFeature ("// apache.org/xml/features/disallow-doctype-decl", pravda); xmlReader.setFeature ("// xml.org/sax/features/external-general-entities", false); xmlReader.setFeature ("// xml.org/sax/features/external-parameter-entities", false);

Nastavili sme ďalšie funkcie, aby sme zabránili XXE.

Rovnako ako JAXP môžeme na výber uzlov použiť výraz XPath:

String expr = String.format ("// * [obsahuje (@% s, '% s')]", atribút, oldValue); XPath xpath = DocumentHelper.createXPath (expr); Zoznam uzlov = xpath.selectNodes (vstup);

Teraz môžeme iterovať a aktualizovať atribút:

pre (int i = 0; i <nodes.size (); i ++) {Element element = (Element) nodes.get (i); element.addAttribute (atribút, newValue); }

Upozorňujeme, že ak v prípade tejto metódy pre daný názov už existuje atribút, bude s touto metódou nahradený. V opačnom prípade sa pridá.

Na vytlačenie výsledkov môžeme znova použiť kód z predchádzajúcej sekcie JAXP.

5. Používanie jOOX

jOOX (jOOX Object-Oriented XML) je obal pre org.w3c.dom balík, ktorý umožňuje plynulé vytváranie a manipuláciu s dokumentmi XML tam, kde je vyžadovaný DOM, ale príliš podrobný. jOOX zabalí iba podkladový dokument a je možné ho použiť na vylepšenie modelu DOM, nie ako alternatívu.

5.1. Maven závislosť

Musíme pridať závislosť na našu pom.xml používať jOOX v našom projekte.

Na použitie s Java 9+ môžeme použiť:

 org.jooq joox 1.6.2 

Alebo s Java 6+ máme:

 org.jooq joox-java-6 1.6.2 

Nájdeme najnovšie verzie servera joox a joox-java-6 v centrálnom úložisku Maven.

5.2. Použitím org.w3c.dom.Element.setAttribute

Samotné API jOOX je inšpirované programom jQuery, ako vidíme na príkladoch nižšie. Pozrime sa, ako to využiť.

Najprv musíme načítať Dokument:

DocumentBuilder builder = JOOX.builder (); Vstup dokumentu = builder.parse (resourcePath);

Teraz to musíme zvoliť:

Zhoda $ = $ (vstup);

Aby ste vybrali Element zákazníka, môžeme použiť Nájsť metóda alebo výraz XPath. V obidvoch prípadoch dostaneme zoznam prvkov, ktoré sa mu zhodujú.

Pozrime sa na Nájsť metóda v akcii:

$ .find ("to") .get () .stream () .forEach (e -> e.setAttribute (atribút, nováHodnota));

Ak chcete získať výsledok ako a String, jednoducho musíme zavolať natiahnuť() metóda:

$ .toString ();

6. Benchmark

Na porovnanie výkonu týchto knižníc sme použili JMH benchmark.

Pozrime sa na výsledky:

| Jednotky porovnávacieho režimu Cnt skóre chybové jednotky | ------------------------------------------------- ------------------- | | AttributeBenchMark.dom4jBenchmark priem. 5 0,150 ± 0,003 ms / operácia | AttributeBenchMark.jaxpBenchmark priem. 5 0,166 ± 0,003 ms / operácia | AttributeBenchMark.jooxBenchmark priem. 5 0,230 ± 0,033 ms / op |

Ako vidíme, pre tento prípad použitia a našu implementáciu majú dom4j a JAXP lepšie skóre ako jOOX.

7. Záver

V tomto rýchlom výučbe sme predstavili, ako upraviť atribúty XML pomocou JAXP, dom4j a jOOX. Tiež sme merali výkonnosť týchto knižníc pomocou benchmarku JMH.

Ako obvykle sú všetky tu zobrazené ukážky kódu k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found