合并2 XML&;使用java提取此数据并将其存储在db表中

合并2 XML&;使用java提取此数据并将其存储在db表中,java,sql-server,xml,jakarta-ee,servlets,Java,Sql Server,Xml,Jakarta Ee,Servlets,我是Java新手,我想做以下任务。请引导我做同样的事情 我想为下面的任务用Java(核心Java或servlet)编写源代码 使用对象、数据结构、接口、线程池、连接池(如果适用)。 如果需要或适用,执行任何验证: 假设有两个xml文件: 第一个xml: <geodata> <person name="tom"> <address>2344 States Drive, MA 01213, USA</address> &l

我是Java新手,我想做以下任务。请引导我做同样的事情

我想为下面的任务用Java(核心Java或servlet)编写源代码

使用对象、数据结构、接口、线程池、连接池(如果适用)。 如果需要或适用,执行任何验证:

  • 假设有两个xml文件:
  • 第一个xml:

    <geodata>
     <person name="tom">
           <address>2344 States Drive, MA 01213, USA</address>
           <phonenumber>333-222-2222</phonenumber>
     </person>
     <person name="mat">
           <address>2345 Gates Drive, PA 11213, USA</address>
           <phonenumber>444-222-2222</phonenumber>
     </person>
    </geodata>
    
    
    美国马萨诸塞州州立大道2344号,邮编01213
    333-222-2222
    美国宾夕法尼亚州盖茨大道2345号,邮编:11213
    444-222-2222
    
    第二个xml:

    <salarydata>
     <person name="mat">
           <salary>$3000</salary>
           <pension>$500</pension>
     </person>
     <person name="tom">
           <salary>$3500</salary>
           <pension>$700</pension>
     </person>
    </salarydata>
    
    
    $3000
    $500
    $3500
    $700
    
    从上述两个xml中,形成一个xml,比如persondata.xml(通过Java 程序,将上述两个文件作为输入),如下所示:

    <persondata>
      <person name="tom">
           <address>2344 States Drive, MA 01213, USA</address>
           <phonenumber>333-222-2222</phonenumber>
           <salary>$3500</salary>
           <pension>$700</pension>
      </person>
      <person name="mat">
           <address>2345 Gates Drive, PA 11213, USA</address>
           <phonenumber>444-222-2222</phonenumber>
           <salary>$3000</salary>
           <pension>$500</pension>
      </person>
    </persondata>
    
    
    美国马萨诸塞州州立大道2344号,邮编01213
    333-222-2222
    $3500
    $700
    美国宾夕法尼亚州盖茨大道2345号,邮编:11213
    444-222-2222
    $3000
    $500
    
  • 使用Java从persondata.xml中提取此数据并存储在persondata db表中。 形成您自己的persondata表结构(保留上述persondata.xml元数据作为参考)。 数据库位于SQL Server中

  • 编写一个html表单,从用户处为每个db字段(例如,States Drive或333或$700)接收一些关键字,并编写一个相应的操作Servlet,用于搜索persondata db表并将匹配的记录打印/回显到用户屏幕上(在本例中为tom的记录)


  • Pl.在本练习中,只要您认为合适,就使用相关的工具/组件,如AJAX、J Query。

    下面是使用JDOM的代码:

    Document xml1 = new SAXBuilder().build(new StringReader("<geodata>\n"
                    + " <person name=\"tom\">\n"
                    + "       <address>2344 States Drive, MA 01213, USA</address>\n"
                    + "       <phonenumber>333-222-2222</phonenumber>\n"
                    + " </person>\n"
                    + " <person name=\"mat\">\n"
                    + "       <address>2345 Gates Drive, PA 11213, USA</address>\n"
                    + "       <phonenumber>444-222-2222</phonenumber>\n"
                    + " </person>\n"
                    + "</geodata>"));
            Document xml2 = new SAXBuilder().build(new StringReader("<salarydata>\n"
                    + " <person name=\"mat\">\n"
                    + "       <salary>$3000</salary>\n"
                    + "       <pension>$500</pension>\n"
                    + " </person>\n"
                    + " <person name=\"tom\">\n"
                    + "       <salary>$3500</salary>\n"
                    + "       <pension>$700</pension>\n"
                    + " </person>\n"
                    + "</salarydata>"));
    
            List<Element> geodata = xml1.getRootElement().getChildren();
            List<Element> salarydata = xml2.getRootElement().getChildren();
            //Element root = new Element("persondata");
            for (Element e : geodata) {
                for (Element e2 : salarydata) {
                    if (e.getAttributeValue("name").equals(e2.getAttributeValue("name"))) {
                        e.addContent(e2.removeContent());
                    }
                }
            }
            Element rootNode = xml1.getRootElement();
            rootNode.setName("persondata");
            new XMLOutputter().output(xml1, System.out);
        }
    
    Document xml1=new SAXBuilder().build(new StringReader)(\n)
    +“\n”
    +美国马萨诸塞州州立大道2344号,邮编01213\n
    +“333-222-2222\n”
    +“\n”
    +“\n”
    +美国宾夕法尼亚州11213盖茨大道2345号\n
    +“444-222-2222\n”
    +“\n”
    + ""));
    文档xml2=new SAXBuilder().build(新建StringReader)(\n)
    +“\n”
    +“$3000\n”
    +“$500\n”
    +“\n”
    +“\n”
    +“$3500\n”
    +“$700\n”
    +“\n”
    + ""));
    List geodata=xml1.getRootElement().getChildren();
    List salarydata=xml2.getRootElement().getChildren();
    //元素根=新元素(“persondata”);
    用于(元素e:地理数据){
    对于(要素e2:工资数据){
    如果(e.getAttributeValue(“name”).equals(e2.getAttributeValue(“name”)){
    e、 addContent(e2.removeContent());
    }
    }
    }
    Element rootNode=xml1.getRootElement();
    setName(“persondata”);
    新的XMLOutputter().output(xml1,System.out);
    }
    
    最后,我找到了我自己问题的答案,效果很好

    package com.techassignment;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.io.Writer;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class Class1 {
        static public void main(String[] arg)
        {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        Document doc = null;
        Document doc2 = null;
        {
        try {
                db = dbf.newDocumentBuilder();
                doc = db.parse(new File("C:\\Users\\mkar\\workspace\\techassignment - new\\src\\com\\techassignment\\1st.xml"));
                doc2 = db.parse(new File("C:\\Users\\mkar\\workspace\\techassignment - new\\src\\com\\techassignment\\2nd.xml"));
                NodeList ndListFirstFile = doc.getElementsByTagName("person");
    
                Node nodeSalary = doc.importNode(doc2.getElementsByTagName("salary").item(0), true);
                Node nodePension = doc.importNode(doc2.getElementsByTagName("pension").item(0), true);
                Node nodeSalary1 = doc.importNode(doc2.getElementsByTagName("salary").item(1), true);
                Node nodePension1 = doc.importNode(doc2.getElementsByTagName("pension").item(1), true);
    
                ndListFirstFile.item(0).appendChild(nodeSalary);
                ndListFirstFile.item(0).appendChild(nodePension);
                ndListFirstFile.item(1).appendChild(nodeSalary1);
                ndListFirstFile.item(1).appendChild(nodePension1);
    
              TransformerFactory tFactory = TransformerFactory.newInstance();
              Transformer transformer = tFactory.newTransformer();
              transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
    
              DOMSource source = new DOMSource(doc);
              StreamResult result = new StreamResult(new StringWriter());
              transformer.transform(source, result); 
    
    
              Writer output = null ;      
              output = new BufferedWriter(new FileWriter("C:\\Users\\mkar\\workspace\\techassignment - new\\src\\com\\techassignment\\testFinal.xml"));
              String xmlOutput = result.getWriter().toString();
    
              output.write(xmlOutput);
    
              output.close();
              System.out.println("XML Merged");
    
        } catch (ParserConfigurationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SAXException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        } catch (TransformerException e4) {
            // TODO Auto-generated catch block
            e4.printStackTrace();
        }
    
        }
        }
    }
    

    有多种方法可以做到这一点。您可以将整个xml传递给一个存储过程,该过程将解析xml并在表中插入数据,也可以使用java循环遍历xml并单独插入数据。