Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java附加到xml表?_Java_Xml_Append - Fatal编程技术网

如何用java附加到xml表?

如何用java附加到xml表?,java,xml,append,Java,Xml,Append,好的,我正在创建一个users类,它请求输入,然后使用java将其存储在一个XML文件中。我想到了创建原始XML文件,但我很难想出如何添加一个属性“id”比上一个用户条目多一个的新用户 以下是我目前掌握的代码: /*imports */ public class CreateUser { static Scanner input = new Scanner(System.in); /* object names*/ String name; St

好的,我正在创建一个users类,它请求输入,然后使用java将其存储在一个XML文件中。我想到了创建原始XML文件,但我很难想出如何添加一个属性“id”比上一个用户条目多一个的新用户

以下是我目前掌握的代码:

/*imports */

    public class CreateUser {   
        static Scanner input = new Scanner(System.in);

/* object names*/
    String name;
    String age;
    String bday;
    String gender;
    String location;
    String orientation;
    String relationship;
    String hobbies;
    String choice;
    String username;
    String password;

    public void makeUser(){

/*left out code to get user entries here 

seemed irrelevant/*

    /*checks for file if it doesn't exist then it creates it else it should append
 the user to the xml document with a id increase of one.
 The appending part I'm not sure how to do.*/
File f = new File("C:\\Users\\Steven\\Workspace\\twitter\\src\\users.xml");
            if(f.exists()) { 
                try {
                    /* need help here*/
                }
            }
            else{
                try{
                    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                    Document users = docBuilder.newDocument();

                    Element user = users.createElement("user");
                    users.appendChild(user);

                    Attr attr = users.createAttribute("id");
                    attr.setValue("0");
                    user.setAttributeNode(attr);

                    Element dname = users.createElement("name");
                    dname.appendChild(users.createTextNode(name));
                    user.appendChild(dname);

                    Element dgender = users.createElement("gender");
                    dgender.appendChild(users.createTextNode(gender));
                    user.appendChild(dgender);

                    Element dlocation = users.createElement("location");
                    dlocation.appendChild(users.createTextNode(location);
                    user.appendChild(dlocation);

                    Element dorientation = users.createElement("orientation");
                    dorientation.appendChild(users.createTextNode(orientation));
                    user.appendChild(dorientation);

                    Element drelationship = users.createElement("relationship");
                    drelationship.appendChild(users.createTextNode(relationship));
                    drelationship.appendChild(drelationship);


                    Element dhobbies = users.createElement("hobbies");
                    dhobbies.appendChild(users.createTextNode(hobbies));
                    dhobbies.appendChild(dhobbies);

                    Element dchoice = users.createElement("choice");
                    dchoice.appendChild(users.createTextNode(choice));
                    dchoice.appendChild(dchoice);

                    Element dusername = users.createElement("username");
                    dusername.appendChild(users.createTextNode(username));
                    dusername.appendChild(dusername);

                    Element dpassword = users.createElement("password");
                    dpassword.appendChild(users.createTextNode(password));
                    dpassword.appendChild(dpassword);

                    Element dbday = users.createElement("birthday");
                    dbday.appendChild(users.createTextNode(bday));
                    dbday.appendChild(dbday);

                    Element dage = users.createElement("age");
                    dage.appendChild(users.createTextNode(age));
                    dage.appendChild(dage);

                    TransformerFactory transformerFactory = TransformerFactory.newInstance();
                    Transformer transformer = transformerFactory.newTransformer();
                    DOMSource source = new DOMSource(users);
                    StreamResult result = new StreamResult(new File("C:\\Users\\Steven\\Workspace\\twitter\\src\\users.xml"));

                    StreamResult test = new StreamResult(System.out);
                    transformer.transform(source, result);
                } catch (ParserConfigurationException pce) {
                    pce.printStackTrace();
                } catch (TransformerException tfe) {
                    tfe.printStackTrace();
                }
            }
        }
我知道有很多代码要看,我不想要一个精确的编码答案,但可能只是如何将属性值附加到用户上一个条目的后面。或者是指向一个有用网站的方向。任何事情我都有点困惑,我觉得我应该得到这么简单的东西。提前感谢您在第一节(
if
block)中提供的任何帮助,我认为您可以在如下附加模式下打开文件以添加
user
假设
user
节点未包装在另一个节点中。

 StreamResult result = new StreamResult(
    new FileWriter("C:\\Users\\Steven\\Workspace\\twitter\\src\\users.xml", true));
上述声明有两个变化:

  • 使用
    FileWriter
    代替
    File
  • 使用第二个参数
    true
    ,以
    append
    模式打开文件
  • 编辑:要获取最大现有ID,您需要读取文件并查找ID标记,如下所示:

      File xmlFile = new File("C:\\Users\\Steven\\Workspace\\twitter\\src\\users.xml");
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
      Document doc = dBuilder.parse(xmlFile);
      doc.getDocumentElement().normalize();
      NodeList nList = doc.getElementsByTagName("userId");//use the id tag name
      int maxId = 0;
      for(Node node: nList){
          if(Integer.parseInt(node.getTextContent()) > maxId ){
            maxId = Integer.parseInt(node.getTextContent());
          }
      }
      int newId = maxId +1; //use this ID
      xmlFile.close();//close the file
    

    以JAXB为例,下面是一个工作示例:

    static class Users {
        private List<User> user = new ArrayList<>();
    
        public List<User> getUsers() {
            return user;
        }
    
        public void setUsers(List<User> users) {
            this.user = users;
        }
    }
    
    static class User {
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setName("user1");
        Users users = new Users();
        users.setUsers(Arrays.asList(user));
    
        JAXB.marshal(users, new File("users.xml"));
    
        users = JAXB.unmarshal(new File("users.xml"), Users.class);
        User user2 = new User();
        user2.setName("user2");
        users.getUsers().add(user2);
    
        JAXB.marshal(users, System.out);
    
    }
    
    静态类用户{
    private List user=new ArrayList();
    公共列表getUsers(){
    返回用户;
    }
    公共用户(列表用户){
    this.user=用户;
    }
    }
    静态类用户{
    私有字符串名称;
    公共void集合名(字符串名){
    this.name=名称;
    }
    公共字符串getName(){
    返回名称;
    }
    }
    公共静态void main(字符串[]args)引发异常{
    用户=新用户();
    user.setName(“user1”);
    用户=新用户();
    users.setUsers(Arrays.asList(user));
    marshal(用户,新文件(“users.xml”);
    users=JAXB.unmarshal(新文件(“users.xml”)、users.class);
    用户user2=新用户();
    user2.setName(“user2”);
    users.getUsers().add(user2);
    marshal(用户,System.out);
    }
    
    考虑SAX,与DOM不同,SAX速度快且没有大小限制。以下是一个基本示例:

    public static void main(String[] args) throws Exception {
        String xml = "<users><user><name>user1</name></user></users>";
        XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {
            @Override
            public void endElement(String uri, String localName, String qName) throws SAXException {
                if (qName.equals("users")) {
                    addUser();
                }
                super.endElement(uri, localName, qName);
            }
    
            private void addUser() throws SAXException {
                super.startElement("", "", "user", null);
                addFileld("name", "user2");
                super.endElement("", "", "user");
            }
    
            private void addFileld(String name, String value) throws SAXException {
                super.startElement("", "", name, null);
                super.characters(value.toCharArray(), 0, value.length());
                super.endElement("", "", name);
            }
        };
        Source src = new SAXSource(xr, new InputSource(new StringReader(xml)));
        Result res = new StreamResult(System.out);
        TransformerFactory.newInstance().newTransformer().transform(src, res);
    }
    
    publicstaticvoidmain(字符串[]args)引发异常{
    字符串xml=“user1”;
    XMLReader xr=new XMLFilterImpl(XMLReaderFactory.createXMLReader()){
    @凌驾
    public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
    if(qName.equals(“用户”)){
    addUser();
    }
    super.endElement(uri、localName、qName);
    }
    私有void addUser()引发SAXException{
    super.startElement(“,”,“user”,null);
    addFileld(“名称”、“用户2”);
    super.endElement(“,”,“user”);
    }
    私有void addFileld(字符串名称、字符串值)引发SAXException{
    super.startElement(“,”,name,null);
    super.characters(value.tocharray(),0,value.length());
    super.endElement(“,”名称);
    }
    };
    Source src=new-SAXSource(xr,new-InputSource(new-StringReader(xml));
    Result res=新的StreamResult(System.out);
    TransformerFactory.newInstance().newTransformer().transform(src,res);
    }
    
    输出:

       <users><user><name>user1</name></user><user><name>user2</name></user></users>
    
    user1user2
    
    请给出一个简短的例子,看看它是什么样子,你的XML。感谢第一个If只是检查文件是否已经存在,在这种情况下,它会将新用户附加到XML文件,否则它会创建XML文件。我可以将result.exists()作为流结果吗?我是否应该在Try{}中为append创建streamresult对象?@user1371330我错过了这一部分。如果要在文件存在时始终追加用户,则只有一个节,并以追加模式打开文件。如果文件不存在,它将创建它,否则它将追加。因此我只需要更改StreamResult=newstreamresult(新文件(“C:\\Users\\Steven\\Workspace\\twitter\\src\\Users.xml”);在第二部分中添加到FileWriter并完全删除if语句?另外,您是否知道如何使id属性比先前输入的users id属性多出一个?谢谢!您已经帮了很大的忙。@user1371330删除您的
    if-else
    ,并将StreamResult更改为
    StreamResult=newstreamresult(new FileWriter(“C:\\Users\\Steven\\Workspace\\twitter\\src\\Users.xml”,true))解决了附加问题!非常感谢。现在我唯一的问题是使id属性的值比上一个属性的值多一个。有什么想法吗?