Martin Kuba napsal:
Petr Šimek wrote:
Dobry den,
snazim se pomoci dom4j prochazet existujici xml soubor, ale mam problem, kdyz narazim na element, ktery obsahuje mixed content.
Napr.
<sekce>Auto <emp>je</emp> cervene.</sekce>

Pak mi u sekce element.getText(); vrati cely text elementu, bez vnoreneho emp, tj. vrati:
Auto cervene.
Ale ja bych potreboval v tu chvili v necem dostat informaci, ze jsou tam tri potomci, tj. nejdriv text Auto, pak element emp a pak text cervene.

Ale k tomu se nemuyu dopracovat, poradite mi?

SAXReader reader = new SAXReader();
Document document = reader.read("pokus.xml");

Element root = document.getRootElement();

for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
  Element element = (Element) i.next();
  // do something
}

Neznam sice DOM4J, ale dle svych zkusenosti s JDOM bych si tipnul,
ze chyba je ve volani getText(). Podle rychle vygooglovaneho javadocu
dela "Returns the text value of this element without recursing through child elements. This method iterates through all Text,CDATA and Entitynodes that this element contains and appends the text values together."
Spravny postup bude zavolat selectNodes("*"), coz vraci seznam
uzlu, jenz jsou potomky.

Jadro zakopaneho pudla je v tom, ze texty jsou uzly (Node), ale nejsou
elementy (Element), takze elementIterator() je nemuze vratit.
Zkuste tedy neco jako:

for(Iterator i = root.selectNodes("*").iterator();i.hasNext();) {
 Node node = (Node).i.next();
 if(node.getNodeType()==Node.TEXT_NODE) {
 ...
 } else if(node.getNodeType()==Node.ELEMENT_NODE) {
 ...

}

Jen pro srovnani, v JDOMu bych zavolal Element.getChildren(),
coz je jednodussi o ten XPath vyraz.
V dom4j si iterator poridis jako element.nodeIterator(). Tahle vecicka je v Branch, ze ktere Element dedi.

Honza Dvorak


Odpovedet emailem