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