Синтаксический анализ XML и установка данных в класс Model.

У меня есть файл XML для анализа:

<API version="1.0">
<response>
<operation name="GET_REQUEST">
<result>
<statuscode>200</statuscode>
<status>Success</status>
<message>Request details fetched successfully.</message>
</result>
<Details>
<parameter>
<name>id</name>
<value>53481</value>
</parameter>
<parameter>
<name>requester</name>
<value>controlm</value>
</parameter>
<parameter>
<name>createdby</name>
<value>controlm</value>
</parameter>
<parameter>
<name>createdtime</name>
<value>1301369106124</value>
</parameter>
<parameter>
<name>duebytime</name>
<value>1302017399984</value>
</parameter>
<parameter>
<name>responseduebytime</name>
<value>-1</value>
</parameter>
<parameter>
<name>fr_duetime</name>
<value>-1</value>
</parameter>
<parameter>
<name>respondedtime</name>
<value>0</value>
</parameter>
<parameter>
<name>resolvedtime</name>
<value>0</value>
</parameter>
<parameter>
<name>completedtime</name>
<value>1301975054764</value>
</parameter>
<parameter>
<name>shortdescription</name>
<value/>
</parameter>
<parameter>
<name>timespentonreq</name>
<value>0hrs 0min</value>
</parameter>
<parameter>
<name>subject</name>
<value>PISSUPP IP-SUPP 26834 IP3STG167 OVERRUNNING - IMM</value>
</parameter>
<parameter>
<name>requesttemplate</name>
<value>Control-M</value>
</parameter>
<parameter>
<name>mode</name>
<value>Auto Ticketing</value>
</parameter>
<parameter>
<name>sla</name>
<value>P3 SLA</value>
</parameter>
<parameter>
<name>ASSET</name>
<value/>
</parameter>
<parameter>
<name>DEPARTMENT</name>
<value/>
</parameter>
<parameter>
<name>site</name>
<value>Service Desk</value>
</parameter>
<parameter>
<name>category</name>
<value>Infrastructure</value>
</parameter>
<parameter>
<name>SUBCATEGORY</name>
<value/>
</parameter>
<parameter>
<name>ITEM</name>
<value/>
</parameter>
<parameter>
<name>technician</name>
<value>rajesh</value>
</parameter>
<parameter>
<name>status</name>
<value>6.Closed</value>
</parameter>
<parameter>
<name>priority</name>
<value>P3</value>
</parameter>
<parameter>
<name>impact</name>
<value>3.Low</value>
</parameter>
<parameter>
<name>urgency</name>
<value>1.High</value>
</parameter>
<parameter>
<name>REQUESTTYPE</name>
<value/>
</parameter>
<parameter>
<name>CLOSURECODE</name>
<value/>
</parameter>
<parameter>
<name>CLOSURECOMMENTS</name>
<value/>
</parameter>
<parameter>
<name>group</name>
<value>Command Center</value>
</parameter>
<parameter>
<name>description</name>
<value/>
</parameter>
<parameter>
<name>control_m</name>
<value>TTD2ETLDC</value>
</parameter>
<parameter>
<name>mem_name</name>
<value>CUSTOMER_DERIVED_TEMP2_REP.sh</value>
</parameter>
<parameter>
<name>order_id</name>
<value>02kbc</value>
</parameter>
<parameter>
<name>job_name</name>
<value>IP3STG167</value>
</parameter>
<parameter>
<name>owner</name>
<value>ttdbods</value>
</parameter>
<parameter>
<name>status reason</name>
<value/>
</parameter>
<parameter>
<name>Main Service Affected</name>
<value/>
</parameter>
<parameter>
<name>Layer</name>
<value/>
</parameter>
<parameter>
<name>ACC Task</name>
<value/>
</parameter>
<parameter>
<name>No of ACC Task</name>
<value/>
</parameter>
<parameter>
<name>failedtime</name>
<value>29 Mar 2011, 04:24:39</value>
</parameter>
<Notes URI="http://localhost:8400/sdpapi/request/53481/notes/"/>
<Worklogs URI="http://localhost:8400/sdpapi/request/53481/logs/"/>
</Details>
</operation>
</response>
</API>

Мое требование состоит в том, чтобы разобрать этот файл XML и установить данные в pojo class.i.e Every <parameter> Для данных тега должно быть установлено соответствующее поле класса pojo.

public class Data {
private int id;
private String requester;
private String createdby;
private String createdtime;
private String duebytime;
private String shortdesciption;
private String timespentonreq;
private String subject;

etc..fields..........

//setters and getters}

Вот код для печати каждого значения:

Document doc = null;
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(
xmlData.getBytes("utf-8"))));
doc.getDocumentElement().normalize();

NodeList nodes = doc.getElementsByTagName("parameter");
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);

Element eElement = (Element) node;

String ticketDetails = getTagValue("value", eElement);

if (ticketDetails != null) {

System.out.println("ticketDetails : "+ getTagValue("value", eElement));

}

}
private static String getTagValue(String tag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(tag).item(0)
.getChildNodes();

Node nValue = (Node) nlList.item(0);
if (nValue == null)
return "No Value";
return nValue.getNodeValue();
}

Я использовал DOM XmL Parser в этом ссылка на сайт .Используя это, я могу анализировать и распечатывать данные. Но я не могу установить данные для отдельных полей.
Может ли кто-нибудь помочь?

0

Решение

Наиболее эффективным способом является использование SAX-парсера. Это в 3 раза эффективнее, чем DOM-парсер. Для этого мы должны создать класс обработчика и расширить DefaultHandler. SAXParser анализирует файл XML последовательно. Вы должны переопределить три метода:

startElement — этот метод вызывается, когда SAXParser получает начальный тег в XML

символы — этот метод вызывается, когда SAXParser получает содержимое между тегами в XML. Но если содержимое тега велико, он может называть его больше, чем один, и каждый раз он имеет часть этого содержимого. Вот почему я использовал StringBuilder в приведенном ниже примере кода. И убедитесь, что вы удалили содержимое объекта StringBuilder в методах endElement после его использования.

endElement -Этот метод вызывается, когда SAXParser получает конечный тег в XML

Смотрите пример кода ниже. Я набрал его в редакторе, но не проверял. Может быть, это будет иметь ошибки времени компиляции. но в основном это правильно. Также добавили метод main, где я добавил код для вызова класса обработчика и анализа XML.

    public class ParameterHandler extends DefaultHandler {
private Data data = null;
private StringBuilder contentsOfTheCurrentTag=null;
private Parameter parameter = null;

public ParameterHandler(){
contentsOfTheCurrentTag =new StringBuilder();
}

public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("Details")) {
data=new Data();
}
if (qName.equalsIgnoreCase("Parameter")) {
parameter=new Parameter();
}}

public void endElement(String uri, String localName,
String qName) throws SAXException {
System.out.println("End Element :" + qName);
int length = contentsOfTheCurrentTag.length();
if (qName.equalsIgnoreCase("name")) {
parameter.setName(contentsOfTheCurrentTag.toString().trim());
}

if (qName.equalsIgnoreCase("value")) {
parameter.setValue(contentsOfTheCurrentTag.toString().trim());
}

if (qName.equalsIgnoreCase("parameter")) {
if("id".equals(parameter.getName())){
data.setId(parameter.getValue())
}
else if("requester".equals(parameter.getName())){
data.setRequester(parameter.getValue())
}
.
.so On...
}
contentsOfTheCurrentTag.delete(0,length);

}

public void characters(char ch[], int start, int length) throws SAXException {
contentsOfTheCurrentTag.append(ch, start, length);
}//Add getter setter for data
}public class ReadXMLFile {

public static void main(String argv[]) {

try {

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
PremiumHandler handler= new PremiumHandler();
saxParser.parse("c:\\file.xml", handler);
Data data=handler.getData();

} catch (Exception e) {
e.printStackTrace();
}
}
}

Дайте мне знать, если у вас есть проблемы с его использованием.

2

Другие решения

Вы можете использовать такой тип конструкций

$attribute = "attr";
$model->$attribute_name = $value; // that work as $model->attr = $value
1

По вопросам рекламы [email protected]