如何使用Java检索XML的元素值?

我是XML新手。 我想读请求名称的基础上下面的XML。 请帮助我如何阅读Java中的以下XML –

<?xml version="1.0"?> <config> <Request name="ValidateEmailRequest"> <requestqueue>emailrequest</requestqueue> <responsequeue>emailresponse</responsequeue> </Request> <Request name="CleanEmail"> <requestqueue>Cleanrequest</requestqueue> <responsequeue>Cleanresponse</responsequeue> </Request> </config> 

如果您的XML是一个string,那么您可以执行以下操作:

 String xml = ""; //Populated XML String.... DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new InputSource(new StringReader(xml))); Element rootElement = document.getDocumentElement(); 

如果你的XML在一个文件中,那么Document document将被实例化如下:

 Document document = builder.parse(new File("file.xml")); 

document.getDocumentElement()返回文档的文档元素(在你的情况下是<config> )的节点。

一旦你有一个rootElement ,你可以访问元素的属性(通过调用rootElement.getAttribute()方法)等等。对于java的org.w3c.dom.Element

更多关于java DocumentBuilder & DocumentBuilderFactory的信息 。 请记住 ,所提供的示例创build了一个XML DOM树,所以如果您有一个巨大的XML数据,树可以是巨大的。

  • 相关的问题 。

更新这是一个获取元素<requestqueue> “值”的<requestqueue>

 protected String getString(String tagName, Element element) { NodeList list = element.getElementsByTagName(tagName); if (list != null && list.getLength() > 0) { NodeList subList = list.item(0).getChildNodes(); if (subList != null && subList.getLength() > 0) { return subList.item(0).getNodeValue(); } } return null; } 

你可以有效地称之为,

 String requestQueueName = getString("requestqueue", element); 

如果您只是希望从XML获取单个值,则可能需要使用Java的XPath库。 举个例子,看看我对前一个问题的回答:

  • 如何在具有默认名称空间的xml文档上使用XPath

它看起来像这样:

 import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; public class Demo { public static void main(String[] args) { DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = domFactory.newDocumentBuilder(); Document dDoc = builder.parse("E:/test.xml"); XPath xPath = XPathFactory.newInstance().newXPath(); Node node = (Node) xPath.evaluate("/Request/@name", dDoc, XPathConstants.NODE); System.out.println(node.getNodeValue()); } catch (Exception e) { e.printStackTrace(); } } } 

如果你只需要一个(第一个)值从XML检索:

 public static String getTagValue(String xml, String tagName){ return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0]; } 

如果你想parsing整个XML文档使用JSoup:

 Document doc = Jsoup.parse(xml, "", Parser.xmlParser()); for (Element e : doc.select("Request")) { System.out.println(e); } 

有很多不同的方法来做到这一点。 您可能想要查看XStream或JAXB 。 有教程和例子。

有两种一般的做法。 您将创build该XML文件的域对象模型,看看这个

第二种select是使用事件驱动parsing,这是DOM xml表示的替代方法。 Imho你可以在这里find这两种基本技术的最佳总体比较。 当然,还有更多关于处理xml的知识,例如,如果给定XML模式定义(XSD),则可以使用JAXB 。

有各种API可用于通过Java读取/写入XML文件。 我会参考使用StaX

另外这可以是有用的 – Java XML API

你可以做一个扩展org.xml.sax.helpers.DefaultHandler并调用的类

 start_<tag_name>(Attributes attrs); 

 end_<tag_name>(); 

因为它是:

 start_request_queue(attrs); 

等等

然后扩展该类并实现所需的xmlconfiguration文件parsing器。 例:

   ...
   public void startElement(String uri,String name,String qname,
                            org.xml.sax.Attributes attrs) 
                  抛出org.xml.sax.SAXException {
     Class [] args = new Class [2];
     args [0] = uri.getClass();
     args [1] = org.xml.sax.Attributes.class;
    尝试{
       String mname = name.replace(“ - ”,“ ”); 
        java.lang.reflect.Method m =  
              getClass()。getDeclaredMethod(“start ”+ mname,args);
       m.invoke(this,new Object [] {uri,(org.xml.sax.Attributes)attrs}); 
     } 
catch(IllegalAccessException e){ 抛出新的RuntimeException(e); }
catch(NoSuchMethodException e){ 抛出新的RuntimeException(e); }
catch(java.lang.reflect.InvocationTargetException e){ org.xml.sax.SAXException se = new org.xml.sax.SAXException(e.getTargetException()); se.setStackTrace(e.getTargetException()的getStackTrace()); }

并在特定的configurationparsing器:

    public void start_Request(String uri,org.xml.sax.Attributes attrs){
      //确保正确读取属性
      System.err.println(“Request,name =”+ attrs.getValue(0);
    }

既然你正在使用这个configuration,你最好的select是apache commons-configuration 。 对于简单的文件,比“原始的”XMLparsing器更容易使用。

请参阅XML操作指南