2010-11-02 41 views
36

我是XML新手。我想根據請求名稱讀取以下XML。請幫助我如何閱讀下面的Java中的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> 
+1

犯錯,這是非常相似,您的其他問題在這裏.. http://stackoverflow.com/questions/4013687/how-to-append-a-new-value-in-xml-使用-java/4013881#4013881 – William 2010-11-02 11:03:33

回答

49

如果你的XML是一個字符串,然後你就可以做到以下幾點:

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記住,所提供的示例創建了一個XML DOM樹,因此如果您有一個巨大的XML數據,樹可能很大。


更新下面是一個例子,以獲取 「值」 元素的<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); 
+3

爲什麼不使用內置的Java SE XPath庫? http://stackoverflow.com/questions/4076910/how-to-retrieve-element-value-of-xml-using-java/4077986#4077986 – 2010-11-03 18:06:58

+0

@Blaise Doughan,你可以。我只是使用DOM來支持仍然活躍在那裏的遺留Java。 – 2010-11-03 18:23:20

+3

不夠公平,如果有人仍然使用JDK 1.4,那麼你的方法是合理的。如果它們在1.5或更高版本上,則javax.xml.xpath庫更容易。我不希望有更好的方式存在時,人們會以艱難的方式去做事情。 – 2010-11-03 18:43:55

4

有很多不同的方式來做到這一點。您可能想要查看XStreamJAXB。有教程和例子。

+0

@sam:你可能也想檢查這個SO問題,http://stackoverflow.com/questions/1558087/xstream-or-simple。 – 2010-11-02 10:55:00

1

有這樣做的兩種常規方法。您將創建該XML文件的域對象模型,請參閱this

第二種選擇是使用事件驅動解析,這是DOM xml表示的替代方法。 Imho你可以找到這兩種基本技術here的最佳整體比較。當然,還有更多關於處理xml的知識,例如,如果給定XML模式定義(XSD),則可以使用JAXB

0

有各種API可用於通過Java讀取/寫入XML文件。 我要提到使用StaX

而且這可能是有用的 - Java XML APIs

0

您可以延伸org.xml.sax.helpers.DefaultHandler中的一類,並調用

start_<tag_name>(Attributes attrs); 

end_<tag_name>(); 

對於它:

start_request_queue(attrs); 

然後擴展該類並實現所需的xml配置文件分析器。例如:

 
    ... 
    public void startElement(String uri, String name, String qname, 
          org.xml.sax.Attributes attrs) 
        throws org.xml.sax.SAXException { 
    Class[] args = new Class[2]; 
    args[0] = uri.getClass(); 
    args[1] = org.xml.sax.Attributes.class; 
    try { 
     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) { throw new RuntimeException(e); }
catch (NoSuchMethodException e) { throw new 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()); }

,並在特定配置解析器:

 
    public void start_Request(String uri, org.xml.sax.Attributes attrs) { 
    // make sure to read attributes correctly 
    System.err.println("Request, name="+ attrs.getValue(0); 
    } 

23

如果你只是希望得到您可能需要使用Java的XPath的庫中的XML一個值。舉個例子看看我的回答上一個問題:

它看起來是這樣的:

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

} 
+0

爲什麼在JDK1.4上這不起作用? – ziggy 2011-02-23 14:35:45

+0

找到需要的節點NodeList節點上的NodeList =(NodeList)xPath.evaluate(「/ Request/@ name」,dDoc,XPathConstants.NODE); – 2011-03-09 06:50:40

+0

我們可以使用JAXB實現相同嗎?它會比這種方法更好嗎? – Prateek 2013-07-09 08:08:12

16

如果你只需要一個(第一)值從檢索xml:

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

如果您想解析整個xml文檔使用JSoup:

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

很快!謝謝 ! @yurin – iCrazybest 2015-11-17 06:10:46

+0

歡迎@iCrazybest。我加了JSoup回答,看看。 – yurin 2015-11-17 06:50:07

+0

感謝指向jsoup - 香草java是在這裏的屁股疼痛 – dermoritz 2017-11-16 14:05:14