Android – Как обрабатывать Webservice в XML?

У меня есть пример XML-файла, как показано ниже:

<?xml version="1.0"?> <h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <h:head> <h:title>tutorial</h:title> <model> <instance> <tutorial id="tutorial"> <name/> <age/> <gender/> <photo/> <date/> <location/> <thanks/> <start/> <end/> <today/> <deviceid/> <subscriberid/> <simserial/> <phonenumber/> <meta> <instanceID/> </meta> </tutorial> </instance> <bind nodeset="/tutorial/name" required="true()" type="string"/> <bind constraint=". &gt; 0 and . &lt; 120" jr:constraintMsg="That's not a valid age!" nodeset="/tutorial/age" required="true()" type="int"/> <bind nodeset="/tutorial/gender" type="select1"/> <bind nodeset="/tutorial/photo" type="binary"/> <bind nodeset="/tutorial/date" type="date"/> <bind nodeset="/tutorial/location" type="geopoint"/> <bind nodeset="/tutorial/thanks" readonly="true()" type="string"/> <bind jr:preload="timestamp" jr:preloadParams="start" nodeset="/tutorial/start" type="dateTime"/> <bind jr:preload="timestamp" jr:preloadParams="end" nodeset="/tutorial/end" type="dateTime"/> <bind jr:preload="date" jr:preloadParams="today" nodeset="/tutorial/today" type="date"/> <bind jr:preload="property" jr:preloadParams="deviceid" nodeset="/tutorial/deviceid" type="string"/> <bind jr:preload="property" jr:preloadParams="subscriberid" nodeset="/tutorial/subscriberid" type="string"/> <bind jr:preload="property" jr:preloadParams="deviceid" nodeset="/tutorial/simserial" type="string"/> <bind jr:preload="property" jr:preloadParams="phonenumber" nodeset="/tutorial/phonenumber" type="string"/> <bind calculate="concat('uuid:', uuid())" nodeset="/tutorial/meta/instanceID" readonly="true()" type="string"/> </model> </h:head> <h:body> <input ref="/tutorial/name"> <label>What's your name?</label> </input> <input ref="/tutorial/age"> <label>How old are you?</label> </input> <select1 ref="/tutorial/gender"> <label>Gender</label> <item> <label>Male</label> <value>male</value> </item> <item> <label>Female</label> <value>female</value> </item> </select1> <upload mediatype="image/*" ref="/tutorial/photo"> <label>Please Take a picture</label> </upload> <input ref="/tutorial/date"> <label>Date</label> </input> <input ref="/tutorial/location"> <label>Where are you?</label> <hint>You need to be outside for your GPS to work.</hint> </input> <input ref="/tutorial/thanks"> <label>Thanks for your time <output value="/tutorial/name"/>!</label> </input> </h:body> </h:html> 

Теперь я хочу заполнить <input ref="/tutorial/name"> данными, поступающими в ответ от веб-службы? У меня есть веб-сервис, который дает ответ правильно. Пожалуйста, помогите мне….

Заменить <input ref="/tutorial/name"> . Вы должны следовать этим трем шагам.

1) Найти <input ref="/tutorial/name"> TAG в файле XML.

2) Обновляйте, удаляйте, заменяйте любую функциональность, которую вы хотите.

3) Запишите содержимое в файл XML

Шаг 1: Найти узел:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse(FILE); Element root = dom.getDocumentElement(); //get node-list, NodeList inputNodeList = root.getElementsByTagName("input"); //iterate over all input node to find the desired one. for(int i=0;i<inputNodeList.length();i++){ Node inputNode = inputNodeList.item(i); //get a single node. String refStr = inputNode.getAttributes().getNamedItem("ref").getNodeValue(); if(refStr.compareTo("/tutorial/name")==0){ // Bingo, You have find the NODE. Now you can do any operations like delete, edit whatever you want. } } 

Шаг 2: Замените операцию.

Вы можете удалить используемый узел.

 inputNode.getParentNode().removeChild(inputNode); 

Если вы хотите заменить узел, посмотрите на метод replaceChild () .

Основная идея заключается в том,

  • Создайте узел из строки ответа . См. Эту ссылку для создания узла XML из строки.
  • Найдите родительский элемент inputNode, используя inputNode.getParentNode () .
  • Используйте метод replaceChild () для замены старого узла на новый узел .

Для примера метода replaceChild () вы можете ссылаться на эту ссылку . Вот хороший учебник для изменения XML-файла с использованием DOM parser – TUTORIAL .

Шаг 3: Запишите содержимое в файл XML.

 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(selectedFile); transformer.transform(source, result); 

Надеюсь, это даст вам некоторый намек на достижение желаемой задачи.

Я использую SAXParser для обработки разбора xml в моем приложении.

 try { /** * Create a new instance of the SAX parser **/ SAXParserFactory saxPF = SAXParserFactory.newInstance(); SAXParser saxP = saxPF.newSAXParser(); XMLReader xmlR = saxP.getXMLReader(); URL url = new URL("http:Your URL"); // URL of the XML XMLHandler myXMLHandler = new XMLHandler(); xmlR.setContentHandler(myXMLHandler); xmlR.parse(new InputSource(url.openStream())); } catch (Exception e) { e.printStackTrace(); } 

Также здесь есть хороший учебник по этому вопросу: http://mobile.tutsplus.com/tutorials/android/android-sdk-build-a-simple-sax-parser/