Java 解析XML并将数据设置为模型类

Java 解析XML并将数据设置为模型类,java,php,jakarta-ee,xml-parsing,domparser,Java,Php,Jakarta Ee,Xml Parsing,Domparser,我下面有一个XML文件要解析: <API version="1.0"> <response> <operation name="GET_REQUEST"> <result> <statuscode>200</statuscode> <status>Success</status> <message>Request details fetched successfully.</mess

我下面有一个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>
下面是打印每个值的代码:

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();
}
单据单据=null;
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
文档生成器dBuilder;
试一试{
dBuilder=dbFactory.newDocumentBuilder();
doc=dBuilder.parse(新建InputSource(新建ByteArrayInputStream(
getBytes(“utf-8”);
doc.getDocumentElement().normalize();
NodeList节点=doc.getElementsByTagName(“参数”);
对于(int i=0;i
我在这里使用了DOM XmL解析器。使用它我可以解析和打印数据。但是我不能将数据设置为单个字段。
有谁能帮上忙吗?

最有效的方法是使用SAX解析器。它的效率是DOM解析器的3倍。为此,我们必须创建一个处理程序类并扩展DefaultHandler。SAXParser按顺序解析XML文件。您必须重写三种方法:

startElement—当SAXParser获取XML中的开始标记时,调用此方法

characters-当SAXParser获取XML中标记之间的内容时,会调用此方法。但如果标记的内容较大,则它可能会调用多个标记,并且每次都有部分内容。这就是我在下面的示例代码中使用StringBuilder的原因。请确保删除StringBuilder obj的内容一旦使用,在endElement方法中使用ect

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();
     }
 }
}

如果使用它有问题,请告诉我。

最有效的方法是使用SAX解析器。它的效率是DOM解析器的3倍。为此,我们必须创建一个处理程序类并扩展DefaultHandler。SAXParser按顺序解析XML文件。您必须覆盖三种方法:

startElement—当SAXParser获取XML中的开始标记时,调用此方法

characters-当SAXParser获取XML中标记之间的内容时,会调用此方法。但如果标记的内容较大,则它可能会调用多个标记,并且每次都有部分内容。这就是我在下面的示例代码中使用StringBuilder的原因。请确保删除StringBuilder obj的内容一旦使用,在endElement方法中使用ect

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();
     }
 }
}

如果使用它有问题,请告诉我。

最有效的方法是使用SAX解析器。它的效率是DOM解析器的3倍。为此,我们必须创建一个处理程序类并扩展DefaultHandler。SAXParser按顺序解析XML文件。您必须覆盖三种方法:

startElement—当SAXParser获取XML中的开始标记时,调用此方法

characters-当SAXParser获取XML中标记之间的内容时,会调用此方法。但如果标记的内容较大,则它可能会调用多个标记,并且每次都有部分内容。这就是我在下面的示例代码中使用StringBuilder的原因。请确保删除StringBuilder obj的内容一旦使用,在endElement方法中使用ect

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();
     }
 }
}

如果使用它有问题,请告诉我。

最有效的方法是使用SAX解析器。它的效率是DOM解析器的3倍。为此,我们必须创建一个处理程序类并扩展DefaultHandler。SAXParser按顺序解析XML文件。您必须覆盖三种方法:

startElement—当SAXParser获取XML中的开始标记时,调用此方法

characters-当SAXParser获取XML中标记之间的内容时,会调用此方法。但如果标记的内容较大,则它可能会调用多个标记,并且每次都有部分内容。这就是我在下面的示例代码中使用StringBuilder的原因。请确保删除StringBuilder obj的内容一旦使用,在endElement方法中使用ect

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();
     }
 }
}

如果您在使用它时遇到问题,请告诉我。

您可以使用此类结构

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

您可以使用这种类型的构造

$attribute = "attr";
$model->$attribute_name = $value; // that work as $model->attr = $value
你可以用su