Разбор XML-узла в Java с использованием XPATH - PullRequest
1 голос
/ 09 ноября 2011

Я только начал пробовать Jaxp13XPathTemplate, но я немного запутался при разборе XML.

Вот пример XML

<fxDataSets> 
<fxDataSet name="NAME_A">
  <link rel="self" href="http://localhost:8080/linkA"/>
  <baseCurrency>EUR</baseCurrency>
  <description>TEST DESCRIPTION A</description>
</fxDataSet>

<fxDataSet name="NAME_B">
  <link rel="self" href="http://localhost:8080/linkB"/>
  <baseCurrency>EUR</baseCurrency>
  <description>TEST DESCRIPTION B</description>
</fxDataSet>
<fxDataSets>  

Я уже могу получить NAME_A иNAME_B, однако я не могу получить описание для обоих узлов.

Вот то, что я придумал.

XPathOperations  xpathTemplate = new Jaxp13XPathTemplate();
    String fxRateURL = "http://localhost:8080/rate/datasets";
    RestTemplate restTemplate = new RestTemplate();
    Source fxRate = restTemplate.getForObject(fxRateURL,Source.class);
    List<Map<String, Object>> currencyList = xpathTemplate.evaluate("//fxDataSet", fxRate , new NodeMapper() {
        public Object mapNode(Node node, int i) throws DOMException 
        {
            Map<String, Object> singleFXMap = new HashMap<String, Object>();
            Element fxDataSet = (Element) node;
            String id    = fxDataSet.getAttribute("name");

            /* This part is not working
            if(fxDataSet.hasChildNodes())
            {
                NodeList nodeList = fxDataSet.getChildNodes();
                int length = nodeList.getLength();

                for(int index=0;i<length;i++)
                {
                    Node childNode = nodeList.item(index);
                    System.out.println("childNode name"+childNode.getLocalName()+":"+childNode.getNodeValue());
                }

            }*/

            return new Object();
        }
    });

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Взгляните публично Список оцените (строковое выражение, исходный контекст, NodeMapper nodeMapper)

  • evaluate принимает NodeMapper<T> в качестве одного из своих параметров
  • возвращает объект типа List<T>

Но для заданного вами фрагмента кода:

  • его передача new NodeMapper() в качестве параметра
  • но пытается вернуть List<Map<String, Object>>, что, безусловно, является нарушением договора API.

Возможное решение:

Я предполагаю, что вы хотите вернуть объект типа FxDataSet, который обертывает элемент <fxDataSet>...</fxDataSet>. Если это так,

  • передать параметр как new NodeMapper<FxDataSet>() как параметр
  • используйте List<FxDataSet> currencyList = ... в качестве выражения левой стороны;
  • изменить тип возвращаемого метода на public FxDataSet mapNode(Node node, int i) throws DOMException.

Посмотрите документацию также для NodeMapper .

Конечно, я не использовал Jaxp13XPathTemplate, но это должно быть распространенной концепцией Java, которая помогла мне выяснить, что на самом деле было не так. Я хотел бы, чтобы это решение работало.

1 голос
/ 09 ноября 2011

попробуйте использовать библиотеку dom4j и ее saxReader.

    InputStream is = FileUtils.class.getResourceAsStream("file.xml");

    SAXReader reader = new SAXReader();
    org.dom4j.Document doc = reader.read(is);
    is.close();
    Element content = doc.getRootElement();  //this will return the root element in your xml file
    List<Element> methodEls = content.elements("element"); // this will retun List of all Elements with name "element" 
0 голосов
/ 07 декабря 2011

Если вы хотите получить дочерние узлы элемента fxDataSet, вы должны сделать:

Node descriptionNode= fxDataSet.getElementsByTagName("description").item(0);
...