从java中读取XML

时间:2015-02-13 18:52:41

标签: java javascript xml getelementbyid

我正试图通过此代码读取xml并且它无法工作..我需要从特定标记中的id读取(getelementbyid) 我需要在我的java代码中更改

这是我的xml代码

<book>
<person>
<name>
  <first id=1 name="Kiran"/>
  <first id=2 name="Pai"/>
  </name>
    <age>22</age>

</person>
<person>
<name>
  <first id=1 name="Bill"/>
  <first id=2 name="Gates"/>
    </name>
  <age>46</age>
</person>
<person>
<name>

  <first id=1 name="Steve"/>
  <first id=2 name="Jobs"/>
    </name>
  <age>40</age>
</person>
</book>

这是我的java代码

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {

 public static void main(String argv[]) {

  try {
  File file = new File("c:\\MyXMLFile.xml");
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  Document doc = db.parse(file);
  doc.getDocumentElement().normalize();
  System.out.println("Root element " + doc.getDocumentElement().getNodeName());
  NodeList nodeLst = doc.getElementsByTagName("employee");
  System.out.println("Information of all employees");

  for (int s = 0; s < nodeLst.getLength(); s++) {

    Node fstNode = nodeLst.item(s);

    if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

           Element fstElmnt = (Element) fstNode;
      NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("firstname");
      Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
      NodeList fstNm = fstNmElmnt.getChildNodes();
      System.out.println("First Name : "  + ((Node) fstNm.item(0)).getNodeValue());
      NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("lastname");
      Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
      NodeList lstNm = lstNmElmnt.getChildNodes();
      System.out.println("Last Name : " + ((Node) lstNm.item(0)).getNodeValue());
    }

  }
  } catch (Exception e) {
    e.printStackTrace();
  }
 }
}

3 个答案:

答案 0 :(得分:2)

您可以查看JAXB。它是Java SE的一部分。您只需将XML模式映射到少数POJO类,并使用JAXB注释对其进行描述。

将XML映射到对象的可能代码(反之亦然)将需要约5行。

您可以在此处阅读:http://docs.oracle.com/javase/tutorial/jaxb/intro/

答案 1 :(得分:0)

这应该有效:

public class XMLReader {
public static void main(String argv[]) {

  try {
    File file = new File("c:\\MyXMLFile.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(file);
    doc.getDocumentElement().normalize();
    System.out.println("Root element " +  doc.getDocumentElement().getNodeName());
   NodeList nodeLst = doc.getElementsByTagName("name");
   System.out.println("Information of all employees");

   for (int s = 0; s < nodeLst.getLength(); s++) {

   Node fstNode = nodeLst.item(s);

   if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

   Element fstElmnt = (Element) fstNode;
   NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("first");

   Element fstNmElmnt = (Element) fstNmElmntLst.item(0);

   System.out.println("First Name : "  +fstNmElmnt.getAttributeNode("name").getNodeValue());


  Element lstNmElmnt = (Element) fstNmElmntLst.item(1);
  System.out.println("Last Name : "  +lstNmElmnt.getAttributeNode("name").getNodeValue());

}

  }
 } catch (Exception e) {
e.printStackTrace();
}
}
}

并更正您的xml以引用属性:

<book>
<person>
<name>
  <first id="1" name="Kiran"/>
  <first id="2" name="Pai"/>
  </name>
    <age>22</age>

</person>
<person>
<name>
  <first id="1" name="Bill"/>
  <first id="2" name="Gates"/>
    </name>
  <age>46</age>
</person>
<person>
<name>

  <first id="1" name="Steve"/>
  <first id="2" name="Jobs"/>
    </name>
  <age>40</age>
</person>
</book>

答案 2 :(得分:-1)

其中一个问题是内置的Java XML库只是一般的。虽然主要用于HTML,但如果您不使用xpath,JSoup更容易使用。

String yourXml = ...
Document doc = Jsoup.parse(yourXml, "", Parser.xmlParser()); 
    for (Element person : doc.getElementsByTag("person")) {
        String firstName = person.getElementById("1").text();
        String lastName = person.getElementById("2").text();
    }