1

さて、入力を要求し、Javaを使用してXMLファイルに格納するusersクラスを作成しています。元のXMLファイルを作成することはできましたが、前のユーザーエントリよりも1つ多い属性「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();
                }
            }
        }

調べるべきコードがたくさんあることを知っているので、正確にコード化された答えは必要ありませんが、前のエントリよりも1つ多く属性値をユーザーに追加する方法が必要かもしれません。または、役立つWebサイトの方向へのポイント。本当に少し戸惑っていたので、こんなにシンプルなものを手に入れたいと思います。助けてくれてありがとう

4

3 に答える 3

1

最初のセクション(ブロック)では、ノードが別のノードにラップされていないと仮定して、if以下のようにファイルを追加モードで開いて、を追加できると思います。useruser

 StreamResult result = new StreamResult(
    new FileWriter("C:\\Users\\Steven\\Workspace\\twitter\\src\\users.xml", true));

上記のステートメントには2つの変更があります。

  1. FileWriterの代わりに使用するFile
  2. trueファイルをappendモードで開く2番目のパラメーターを使用します。

編集:既存の最大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
于 2012-11-25T06:09:55.687 に答える
1

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

}
于 2012-11-25T07:00:09.090 に答える
0

SAXを検討してください。DOMとは異なり、高速でサイズ制限がありません。基本的な例は次のとおりです。

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

出力:

   <users><user><name>user1</name></user><user><name>user2</name></user></users>
于 2012-11-25T08:45:42.547 に答える