I'm trying to read XML(whatever, i don't know it's structure, bcz i'm reading flie from server.), and i searched a lot on SO. but not found anything helpful.
1> i want to retrieve XML's node name, starting from root to end of file, child or child of child untill there's no child or sibling remaining.
2> in similar question, i found that they use tagname to retrieve value of that tag, so i want to pass that node name inside this to get value...
is it possible to do dynamically. or have to follow same structure as in previous questions like statically add tagname to retrieve value.
after doing this in java, i want to create executable jar, and want to use it in mirth.
EDIT
i want to find element and it's value such that, in first condition i'm looping my arraylist which i named masterheader
which contain all tag name, and in second loop i'm going to find node name from xml, and and inside that two for loop i specified one condition, if both match, then it get node name and it store a value in , separated form, because i want to convert it in csv
.
here, masterheader and childheader is arraylist
. masterheader contain all header by default. and we gonna add nodename in childheader
, nd if both match then we add value in result string.
for e.g. masterheader = [employeename, employeesurname, fathername, mobile, salary]
and in childheader = [employeename, mobile, salary]
//this is based on xml parsing.
for(i=0;i<masterheader.size();i++)
{
for(j=0;j<childheader.size();j++)
{
if((masterheader[i]).equals(childheader[j]))
{
//get the value of that node, + ","
}
else
{
count++
}
}
if(count==childheader.size()){
//add into result string +null+","
}
}
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("document.xml"));
NodeList nodeList = document.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
// do something with the current element
System.out.println(node.getNodeName());
}
}
}
i think this will help
You could use a StAX parser for this purpose.
XML sample employees.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employees count="4">
<employee>
<id>2</id>
<firstName>Jane</firstName>
<lastName>Doe</lastName>
<income>20000.0</income>
</employee>
<employee>
<id>3</id>
<firstName>Alfred</firstName>
<lastName>Pennyworth</lastName>
<income>30000.0</income>
</employee>
<employee>
<id>4</id>
<firstName>Tony</firstName>
<lastName>Stark</lastName>
<income>40000.0</income>
</employee>
<employee>
<id>42</id>
<firstName>Foo</firstName>
<lastName>Bar</lastName>
<income>15.0</income>
</employee>
</employees>
Java code
try (InputStream stream = new FileInputStream("employees.xml")) {
XMLInputFactory inputFactory = XMLInputFactory.newFactory();
inputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
XMLStreamReader reader = inputFactory.createXMLStreamReader(stream);
while (reader.hasNext()) {
switch (reader.next()) {
case XMLStreamConstants.START_ELEMENT:
System.out.println("Start " + reader.getName());
for (int i = 0, count = reader.getAttributeCount(); i < count; i++) {
System.out.println(reader.getAttributeName(i) + "=" + reader.getAttributeValue(i));
}
break;
case XMLStreamConstants.END_ELEMENT:
System.out.println("End " + reader.getName());
break;
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.SPACE:
String text = reader.getText();
if (!text.trim().isEmpty()) {
System.out.println("text: " + text);
}
break;
}
}
}
Note that you could easily modify the START_ELEMENT
case to compare the tag name to some value. (Probably you could ignore any other cases if you only want to check those elements.)
Output
Start employees
count=4
Start employee
Start id
text: 2
End id
Start firstName
text: Jane
End firstName
Start lastName
text: Doe
End lastName
Start income
text: 20000.0
End income
End employee
Start employee
Start id
text: 3
End id
Start firstName
text: Alfred
End firstName
Start lastName
text: Pennyworth
End lastName
Start income
text: 30000.0
End income
End employee
Start employee
Start id
text: 4
End id
Start firstName
text: Tony
End firstName
Start lastName
text: Stark
End lastName
Start income
text: 40000.0
End income
End employee
Start employee
Start id
text: 42
End id
Start firstName
text: Foo
End firstName
Start lastName
text: Bar
End lastName
Start income
text: 15.0
End income
End employee
End employees