2013-09-16 1 views
2

Я пытаюсь разработать SOA-клиент & парсер, который является специфическим для нашего проекта. Я уже завершил работу с клиентом, и он вызывает много видов (несколько разных) SOAP-сервисов и получает ответ SOAP-сообщения в формате XML.Java: проанализируйте XML и привяжите все содержимое данных к карте <K, V>

Моя цель:

Получить значение любого узла или атрибута из любого типа коллекции, и она должна быть разработана для всех моих ответов веб-служб.

, например. я буду называть вроде как это:

String h1 = collection.get("html/body/h1"); 

и значение h1 должно быть 'StackOverflow' и происходят из:

<html> 
    <head></head> 
    <body> 
    <h1>StackOverflow</h1> 
    <p>XML parsing in Java</p> 
    </body> 
</html> 

т.д.

Мой подход:

сейчас У меня есть ответное сообщение. Я хочу проанализировать его и присвоить всем значениям узла (и атрибута) коллекции (карте) и получить данные из этой коллекции. Ключ коллекции (Карта) ключ будет путь узла, а значение будет значением узла или атрибута.

например

<MethodResponse xmlns="any.xmlns"> 
    <MethodResult>any value</MethodResult> 
    <Node1> 
     <Node2> 
      <Node3> 
       node3 value is here 
      <Node3> 
     </Node2> 
    </Node1> 
    <respCode>99</respCode> 
    <respNote>any value</respNote> 
</MethodResponse> 

Если мне нужно respCode здесь, я мог бы назвать это таким образом:

String respCode = map.get("/MethodResponse/respCode"); 

или, к node3:

String node3Value = map.get("/MethodResponse/Node1/Node2/Node3"); 

как XPath. Но я не хочу никакого сопоставления или какого-либо Java-класса. Я просто хочу получить доступ к значению узлов (или атрибутов) из его пути.

критерии

успеха:

Он работает для этих и нескольких различных сообщений SOAP:

И мои вопросы:

  1. мой подход верно?
  2. Если да, то как я могу это сделать? Есть ли какой-либо рабочий код или учебник?
  3. Если нет, как я могу это сделать?
+2

это не так просто, как вы думаете, это прямо сейчас. Вы будете сталкиваться элементы, которые имеют тот же путь - например, html/body/table/tr/td - и поэтому ваша идея карты не будет работать –

+1

Лучше сериализовать/несериализовать в набор объектов с иерархией. Google Java JAXB. – Archer

+0

@archer, к сожалению, я должен делать он без использования какого-либо класса/объекта. – OguzOzkeroglu

ответ

1

Создание парсера Java DOM XML выполняется с использованием класса javax.xml.parsers.DocumentBuilderFactory. Вот пример:

DocumentBuilderFactory builderFactory = 
     DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = null; 
try { 
    builder = builderFactory.newDocumentBuilder(); 
} catch (ParserConfigurationException e) { 
    e.printStackTrace(); 
} 

разборе XML-файла в дереве DOM с помощью DocumentBuilder делается так:

try { 
    Document document = builder.parse(
      new FileInputStream("data\\text.xml")); 
} catch (SAXException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

В верхней части находится объект Document. Объект Document имеет один корневой элемент, который возвращается вызов getDocumentElement(), как это:

Element rootElement = document.getDocumentElement(); 

получить ребенок элемента

NodeList nodes = element.getChildNodes(); 

for(int i=0; i<nodes.getLength(); i++){ 
    Node node = nodes.item(i); 

    if(node instanceof Element){ 
    //a child element to process 
    Element child = (Element) node; 
    String attribute = child.getAttribute("width"); 
    } 
} 

Теперь у вас есть необходимый узел, так что вы можете создайте, поместите его на карту, как хотите, и сделайте необходимым для вас ключ. Метод transformer.transform (новый DOMSource (документ), работа с любым узлом Dom или элемент

Создание строки из документа

TransformerFactory transFactory = TransformerFactory.newInstance(); 
Transformer transformer = transFactory.newTransformer(); 
StringWriter buffer = new StringWriter(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
transformer.transform(new DOMSource(document), 
     new StreamResult(buffer)); 
String str = buffer.toString(); 
Смежные вопросы