summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/utils/XmlElementParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/com/c2kernel/utils/XmlElementParser.java')
-rwxr-xr-xsource/com/c2kernel/utils/XmlElementParser.java115
1 files changed, 115 insertions, 0 deletions
diff --git a/source/com/c2kernel/utils/XmlElementParser.java b/source/com/c2kernel/utils/XmlElementParser.java
new file mode 100755
index 0000000..f6fef4b
--- /dev/null
+++ b/source/com/c2kernel/utils/XmlElementParser.java
@@ -0,0 +1,115 @@
+package com.c2kernel.utils;
+
+import java.io.StringReader;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+public class XmlElementParser
+{
+ public static String[] parse(String data, String xpath)
+ {
+ try {
+ return Dom4JElementParser.parse(data, xpath);
+ } catch (NoClassDefFoundError ex) {
+ Logger.msg(5, "Using old xpath parser");
+ return parseOld(data, xpath);
+ }
+ }
+
+ public static String[] parseOld(String data, String path)
+ {
+ Vector returnData = new Vector();
+ String[] returnArray = new String[0];
+ try
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ StringReader is = new StringReader(data);
+ Document doc = builder.parse(new InputSource(is));
+ StringTokenizer pathTokens = new StringTokenizer(path, "/");
+ int taille = pathTokens.countTokens();
+ String[] pathElements = new String[taille];
+ int i=taille;
+ while (pathTokens.hasMoreElements())
+ pathElements[--i] = pathTokens.nextToken();
+
+ if (Logger.doLog(6)) {
+ Logger.msg(6, "Path elements:");
+ for (int x=0;x<pathElements.length;x++)
+ Logger.debug(6, pathElements[x]);
+ }
+
+ Logger.msg(6, "Looking for attribute "+pathElements[0]+" in "+pathElements[1]);
+ NodeList nl = doc.getElementsByTagName(pathElements[1]);
+ for (int j = 0; j < nl.getLength(); j++)
+ {
+ Logger.msg(6, "Found one");
+ Element e = (Element)nl.item(j);
+ boolean match=true;
+ Node child=e;
+ for (int k=2;k<taille&&match;k++)
+ {
+ Logger.msg(6, "Checking parent "+pathElements[k]);
+ child = child.getParentNode();
+ if (!child.getNodeName().equals(pathElements[k]))
+ {
+ Logger.msg(6, "No match for "+child.getNodeName());
+ match=false;
+ }
+ else
+ Logger.msg(6, "Match");
+ }
+ if (match&&e.hasAttribute(pathElements[0])) {
+ Logger.msg(6, "Matching Attribute "+pathElements[0]+"="+e.getAttribute(pathElements[0]));
+ returnData.add(e.getAttribute(pathElements[0]));
+ }
+ }
+
+ Logger.msg(6, "Looking for element "+pathElements[0]);
+ nl = doc.getElementsByTagName(pathElements[0]);
+ for (int j = 0; j < nl.getLength(); j++)
+ {
+ Logger.msg(6, "Found one");
+ Element e = (Element)nl.item(j);
+ boolean match=true;
+ Node child=e;
+ for (int k=1;k<taille&&match;k++)
+ {
+ Logger.msg(6, "Checking parent "+pathElements[k]);
+ child = child.getParentNode();
+ if (!child.getNodeName().equals(pathElements[k]))
+ {
+ Logger.msg(6, "No match for "+child.getNodeName());
+ match=false;
+ }
+ else
+ Logger.msg(6, "Match");
+ }
+ if (match)
+ {
+ String s =e.getFirstChild().getNodeValue();
+ Logger.msg(6, "Found Element "+pathElements[0]+"="+s);
+ if (s!=null) returnData.add(s);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ //Logger.error(e);
+ }
+ Logger.msg(3, returnData.size()+" values found for "+path);
+ returnArray=new String[returnData.size()];
+ for (int i=0;i<returnArray.length;i++)
+ returnArray[i] = (String)returnData.get(i);
+ return returnArray;
+ }
+}