I'd like to parse this XML file:
<?xml version="1.0"?>
<Gist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/Gist.xsd">
<Name>AboveOrEqualToThreshold</Name>
<Version>1</Version>
<Tags>
<Tag>Comparison</Tag>
</Tags>
<Description>Determines if a value is at or over a threshold or not.</Description>
<Configuration />
<OutputType>
<ScalarType>Boolean</ScalarType>
</OutputType>
<PertinentData>
<Item>
<Name>ValueMinusThreshold</Name>
</Item>
<Item>
<Name>ThresholdMinusValue</Name>
</Item>
</PertinentData>
<Scenarios>
<Scenario>
<ID>THRESHOLD_DOES_NOT_APPLY</ID>
<Description>The threshold does not apply.</Description>
</Scenario>
<Scenario>
<ID>ABOVE_THRESHOLD</ID>
<Description>The value is above the threshold.</Description>
</Scenario>
<Scenario>
<ID>EQUAL_TO_THRESHOLD</ID>
<Description>The value is equal to the threshold.</Description>
</Scenario>
<Scenario>
<ID>NOT_ABOVE_THRESHOLD</ID>
<Description>The value is not above the threshold.</Description>
</Scenario>
</Scenarios>
</Gist>
To get me that value at this XPATH /Gist/Name, so for this file it would be a String:
and the scenarios for this file at this XPATH Gist/Scenarios/Scenario/ID/*, so for this file it would be a list of Strings:
THRESHOLD_DOES_NOT_APPLY
ABOVE_THRESHOLD
EQUAL_TO_THRESHOLD
NOT_ABOVE_THRESHOLD
So the data structure for this would be:
Map<String,List<String>>
How can I accomplish this in Java, this seems pretty straight forward but I am unsuccess in my attempts to get this.
Any help or assistance would be much appreciated.
My implementation attempt:
static Map<Node, Node> parseScenarioByGist(String filename) throws IOException, XPathException {
XPath xpath = XPathFactory.newInstance().newXPath();
Map<Node, Node> scenarioByGist = new LinkedHashMap<Node, Node>();
try (InputStream file = new BufferedInputStream(Files.newInputStream(Paths.get(filename)))) {
NodeList nodes = (NodeList) xpath.evaluate("//Gist", new InputSource(file), XPathConstants.NODESET);
int nodeCount = nodes.getLength();
for (int i = 0; i < nodeCount; i++) {
Node node = nodes.item(i);
Node gist = (Node) xpath.evaluate("Gist/Name", node, XPathConstants.NODE);//String node.getAttributes().getNamedItem("name").getNodeValue();
Node scenario = (Node) xpath.evaluate("Gist/Scenarios/Scenario/ID/*", node, XPathConstants.NODE);
scenarioByGist.put(gist, scenario);
}
}
return scenarioByGist;
}
I am assuming when you say you need the output as
Map<String, List<String>>
you mean
Map<Name, List<Scenarios>>
(correct me if I am wrong!!!). I have written something on the basis of that using the Conversion Box . Have a look ....
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cjm.component.cb.map.ToMap;
public class DummyClass
{
public static void main(String[] args)
{
try
{
String xml = "<?xml version=\"1.0\"?><Gist xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"../schema/Gist.xsd\"><Name>AboveOrEqualToThreshold</Name><Version>1</Version><Tags><Tag>Comparison</Tag></Tags><Description>Determines if a value is at or over a threshold or not.</Description><Configuration /><OutputType><ScalarType>Boolean</ScalarType></OutputType><PertinentData><Item><Name>ValueMinusThreshold</Name></Item><Item><Name>ThresholdMinusValue</Name></Item></PertinentData><Scenarios><Scenario><ID>THRESHOLD_DOES_NOT_APPLY</ID><Description>The threshold does not apply.</Description></Scenario><Scenario><ID>ABOVE_THRESHOLD</ID><Description>The value is above the threshold.</Description></Scenario><Scenario><ID>EQUAL_TO_THRESHOLD</ID><Description>The value is equal to the threshold.</Description></Scenario><Scenario><ID>NOT_ABOVE_THRESHOLD</ID><Description>The value is not above the threshold.</Description></Scenario></Scenarios></Gist>";
Map<String, Object> map = (new ToMap()).convertToMap(xml); // Conversion Box
Map<String, Object> mapGist = (Map<String, Object>) map.get("Gist");
String name = (String) mapGist.get("Name");
List<Map<String, Object>> scenarioMapList = (List<Map<String, Object>>) mapGist.get("Scenarios");
List<String> scenarioList = new ArrayList<String>();
for (int index = 0; index < scenarioMapList.size(); index++)
{
Map<String, Object> scenarioMap = scenarioMapList.get(index);
scenarioList.add((String) scenarioMap.get("ID"));
}
Map<String, List<String>> whatMosawiWants = new HashMap<String, List<String>>();
whatMosawiWants.put(name, scenarioList);
System.out.println("What Mosawi wants: " + whatMosawiWants);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Output:
-------- XML Detected --------
-------- Map created Successfully --------
What Mosawi wants: {AboveOrEqualToThreshold=[THRESHOLD_DOES_NOT_APPLY, ABOVE_THRESHOLD, EQUAL_TO_THRESHOLD, NOT_ABOVE_THRESHOLD]}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.