2015-11-29 40 views
2

我只想改變jojo餐廳的評分,我試過這段代碼,但沒有工作,請幫忙。下面是我的xml文檔和我擁有的代碼。更新xml與xpath

<city> 
    <beirut> 
     <restaurant> 
      <name>sada</name> 
     </restaurant> 
    </beirut> 
    <jbeil> 
     <restaurant> 
      <name>toto</name> 
      <rating>4.3/5</rating> 
     </restaurant> 
     <restaurant> 
      <name>jojo</name> 
      <rating>4.3/5</rating> 
     </restaurant> 
    </jbeil> 
    <sour> 
     <restaurant> 
      <name>sada</name> 
     </restaurant> 
    </sour> 
</city> 

代碼:

try { 
    File inputFile = new File("src/xpath/josephXml.xml"); 
    DocumentBuilderFactory dbFactory 
     = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder; 

    dBuilder = dbFactory.newDocumentBuilder(); 

    Document doc = dBuilder.parse(inputFile); 
    doc.getDocumentElement().normalize(); 

    XPath xPath = XPathFactory.newInstance().newXPath(); 

    String expression = "/City/Jbeil/Restaurants/Restaurant[name='Feniqia']/rating"; 


    Element e = (Element)xPath.evaluate(expression, doc, XPathConstants.NODE); 

    if (e != null){ 
     e.setTextContent("5/5"); 
    } 

    } catch (ParserConfigurationException | SAXException | IOException e) { 
    } 
+0

什麼是「沒有工作」是什麼意思?它做了什麼或不做什麼?此外,你拋出異常在捕獲,而不是打印出來,它可能有用的信息。 – blm

+0

評級保持不變,4.3 – user3630405

+1

xpath表達式區分大小寫,'City'!='city',... – mata

回答

0

,如果你只需要編寫結果(還有其他方法):

進口的java.io.File;

import org.w3c.dom.Document; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 


try 
{ 
Transformer trans = TransformerFactory.newInstance().newTransformer(); 
Result out = new StreamResult(new File("result.xml")); 
Source in = new DOMSource(doc); 
trans.transform(in, out); 
} 
catch (Exception exe) 
{ 
System.err.println(exe.getMessage()); 
} 
0

首先,你的XPath沒有對準您發佈的XML(沒有<restaurants>Feniqia名稱)和所有應該已經降低的情況下。可能你從一個大的xml文檔中提取了一塊。爲了演示,我使用了jojo餐廳。

其次,XPath本身不更新XML,您將需要創建一個新文檔。只需在最後添加轉換:

import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 
import javax.xml.xpath.*; 

import java.io.File; 
import java.io.IOException; 

import org.xml.sax.*; 
import org.w3c.dom.*; 

public class RatingUpdate {  

    public static void main(String [] args) { 

      try { 
       File inputFile = new File("src/xpath/josephXml.xml"); 

       DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder dBuilder; 

       dBuilder = dbFactory.newDocumentBuilder(); 

       Document doc = dBuilder.parse(inputFile); 
       doc.getDocumentElement().normalize(); 

       XPath xPath = XPathFactory.newInstance().newXPath(); 

       String expression = "/city/jbeil/restaurant[name='jojo']/rating"; 

       Element e = (Element)xPath.evaluate(expression, doc, XPathConstants.NODE); 

       if (e != null){ 
        e.setTextContent("5/5"); 
       } 

       Transformer xformer = TransformerFactory.newInstance().newTransformer(); 
       xformer.transform(new DOMSource(doc), new StreamResult(new File("src/xpath/josephXml_update.xml"))); 

      } catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException | 
         TransformerException e) { 

      } 
    } 
}