解析 XML 并将数据设置为模型 class
Parse XML and set data to Model class
我有一个 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 每个 <parameter>
标签数据应设置为 pojo class 各自的字段。
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();
}
我在这个 link 中使用了 DOM XmL 解析器。使用它我能够解析和打印数据。但我无法将数据设置到各个字段。
有人可以帮忙吗?
最有效的方法是使用 SAX 解析器。它的效率是 DOM 解析器的 3 倍。为此,我们必须创建一个处理程序 class 并扩展 DefaultHandler。 SAXParser 按顺序解析 XML 文件。您必须覆盖三个方法:
startElement- 当 SAXParser 在 XML
中获取开始标记时调用此方法
characters - 当 SAXParser 获取 XML 中标签之间的内容时调用此方法。但是,如果标签的内容很大,那么它可能会多次调用它,并且每次它都包含该内容的一部分。这就是我在下面的示例代码中使用 StringBuilder 的原因。并确保在使用 endElement 方法后删除 StringBuilder 对象的内容。
endElement - 当 SAXParser 在 XML
中获取结束标记时调用此方法
参见下面的示例代码。我已经在编辑器中输入了它,但还没有测试过。可能会有编译时错误。但大部分是正确的。还添加了主要方法,我在其中添加了代码来调用处理程序 class 并解析 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();
}
}
}
如果您在使用时遇到问题,请告诉我。
你可以使用这种类型的结构
$attribute = "attr";
$model->$attribute_name = $value; // that work as $model->attr = $value
我有一个 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 每个 <parameter>
标签数据应设置为 pojo class 各自的字段。
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();
}
我在这个 link 中使用了 DOM XmL 解析器。使用它我能够解析和打印数据。但我无法将数据设置到各个字段。 有人可以帮忙吗?
最有效的方法是使用 SAX 解析器。它的效率是 DOM 解析器的 3 倍。为此,我们必须创建一个处理程序 class 并扩展 DefaultHandler。 SAXParser 按顺序解析 XML 文件。您必须覆盖三个方法:
startElement- 当 SAXParser 在 XML
中获取开始标记时调用此方法characters - 当 SAXParser 获取 XML 中标签之间的内容时调用此方法。但是,如果标签的内容很大,那么它可能会多次调用它,并且每次它都包含该内容的一部分。这就是我在下面的示例代码中使用 StringBuilder 的原因。并确保在使用 endElement 方法后删除 StringBuilder 对象的内容。
endElement - 当 SAXParser 在 XML
中获取结束标记时调用此方法参见下面的示例代码。我已经在编辑器中输入了它,但还没有测试过。可能会有编译时错误。但大部分是正确的。还添加了主要方法,我在其中添加了代码来调用处理程序 class 并解析 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();
}
}
}
如果您在使用时遇到问题,请告诉我。
你可以使用这种类型的结构
$attribute = "attr";
$model->$attribute_name = $value; // that work as $model->attr = $value