• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 260
  • Last Modified:

need a snippet ( probably with XPAth ) to traverse all XML nodes and produce an output file

containing all full node names ( combining all levels, i.e. level1name.level2name. etc. .. ) and
their values for example, <abc>
                                                 <val1tag> value 1 <val1tag\>

would produce abc.val1tag = value 1
0
AlexF777
Asked:
AlexF777
  • 2
1 Solution
 
Tony McCreathTechnical SEO ConsultantCommented:
Using XSL may be a better way.

Could you provide a bit more detail on what you need. A more extensive and complete example of the input and output would help.
0
 
sundar62Commented:
Attached is a sample java code to get the result. Not sure if this is what you are looking for -
0
 
sundar62Commented:

import java.io.OutputStream;
import java.io.PrintStream;
 
import javax.xml.transform.Transformer;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
import java.util.ArrayList;
import java.util.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
 
public class XmlWalker {
 
    public static void main(String[] args) throws Exception {
        new XmlWalker().walk("persons.xml");
    }
 
    private void walk(String filename) throws Exception {
        Document dom = parseXmlFile(filename);
        printXpath("", dom);
    }
 
    private Document parseXmlFile(String filename) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db.parse(filename);
    }
 
    private void printXpath(String xpath, Node node) {
        short type = node.getNodeType();
        if (type == Node.DOCUMENT_NODE || type == Node.ELEMENT_NODE) {
            if (type == Node.ELEMENT_NODE) {
                xpath += nodePath(node);
                System.out.println(xpath + "-->" + node.getTextContent());
            }
            NodeList children = node.getChildNodes();
            for (int index = 0; index < children.getLength(); ++index) {
                printXpath(xpath, children.item(index));
            }
        }
    }
 
    private String nodePath(Node node) {
        Node parent = node.getParentNode();
        StringBuilder buf = new StringBuilder(256);
 
        if (parent == null || parent.getNodeType() == Node.DOCUMENT_NODE) {
            buf.append("/").append(node.getNodeName());
        } else if (getNodeId(node) != null) {
            buf.append(".").append(node.getNodeName()).append("[@id='").append(getNodeId(node) + "']");
        } else {
            buf.append('.').append(node.getNodeName());
            List<Node> siblings = getChildrenByName(parent, node.getNodeName());
            if (siblings.size() > 1) {
                buf.append("[").append((siblings.indexOf(node) + 1)).append("]");
            }
        }
        return buf.toString().toString();
    }
 
    private String getNodeId(Node node) {
        Node id = getNamedItem(node.getAttributes(), "id");
        return (id != null) ? id.getNodeValue() : null;
    }
 
    private Node getNamedItem(NamedNodeMap attributes, String name) {
        return (attributes != null) ? attributes.getNamedItem(name) : null;
    }
 
    private List<Node> getChildrenByName(Node parent, String name) {
        NodeList children = parent.getChildNodes();
        List<Node> results = new ArrayList<Node>();
        for (int i = 0; i < children.getLength(); ++i) {
            if (nameEquals(children.item(i), name))
                results.add(children.item(i));
        }
        return results;
    }
 
    private boolean nameEquals(Node child, String name) {
        return (child != null && name.equals(child.getNodeName()));
    }
} 

Open in new window

0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now