2017-07-04 119 views
0

我有讀取XML文件的程序。最近我的供應商更改了源XML文件的一部分,我不知道如何閱讀更改的部分。JAVA讀取XML,直接從元素

XML:

<Product> 
<Weight>5,000</Weight> 
<Color>blue</Color> 
<Stock Warehouse_name="London" Availability="5,00"/> 
<Stock Warehouse_name="Berlin" Availability="0,00"/> 
<Stock Warehouse_name="Sydney" Availability="42,00"/> 
</Product> 

也許你已經看到了我的問題。重量和顏色都可以,但股票是我的問題。而不是給元素之間的信息,信息是直接的元素。我正在使用標準方法檢索數據:

color = (eElement.getElementsByTagName("Color").item(0).getTextContent()); 

任何建議?我對Java很新,所以請儘可能簡單地向我解釋一下。

回答

0

要檢索的值稱爲attributes。 您可以使用getAttributeElement來檢索屬性的值。

下面的代碼應該同樣的工作:

NodeList stockList = eElement.getElementsByTagName("Stock"); 
for (int i = 0; i < stockList.getLength(); i++) 
{ 
    Node stockNode = stockList.item(i); 
    if (stockNode.getNodeType() == Node.ELEMENT_NODE) 
    { 
     Element stockElement = (Element)stockNode; 
     System.out.println("Warehouse name : " + stockElement.getAttribute("Warehouse_name")); 
     System.out.println("Availability : " + stockElement.getAttribute("Availability")); 
    } 
} 
+0

感謝,工程巨大。 – nilrem

2

你需要獲得股票的節點,並轉換爲元素,那麼你就可以得到你想要的屬性。

final DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
// textoXml contains your xml file 
final Document doc = dBuilder.parse(new ByteArrayInputStream(textoXml.getBytes())); 
// Here you gat the Stock node you want and cast to Element 
final Element eStock = (Element) doc.getElementsByTagName("Stock").item(0); 
final String warehouseName = eStock.getAttribute("Warehouse_name"); 

你可以看到https://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

-1

一些其他的例子,我建議你JDOM http://www.jdom.org/

package javaxml; 

import java.io.File; 
import java.util.List; 

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.input.SAXBuilder; 

public class DomTest { 

    public void test(){ 
     try{ 
      String xmlPath = "myfile.xml"; 
      File xmlFile = new File(xmlPath); 
      SAXBuilder sax = new SAXBuilder();  
      Document xDoc = sax.build(xmlFile); 
      List<Element> xStocks = xDoc.getRootElement().getChildren("Stock"); 
      for(Element xStock : xStocks){ 
       System.out.println(xStock.getAttributeValue("Warehouse_name")); 
       System.out.println(xStock.getAttributeValue("Availability")); 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

當Java SE完全具有相同的功能時,最好避免依賴第三方庫。 – VGR

+0

我想喲看到你只使用讀取多個命名空間的Java庫:D – shop350