2011-05-19 74 views
0

可能是一個新手問題,但是,我試圖用Java解析和更改ncx文件(重要的ePub格式),以確保PlayOrder屬性位於,正確的順序(1,2,3,4 ...)。 這是我的java到目前爲止,它工作得很好,但它將PlayOrder設置爲(1,3,5,7 ...)。猜猜它是解析一個標籤到很多()。有任何想法嗎?使用Java解析ncx(xml)以更改PlayOrder

package com.mkyong.common; 

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

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class ModifyXMLFile { 

public static void main(String argv[]) { 

    try{ 
String filepath = "toc.ncx"; 
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

Document doc = docBuilder.parse(filepath); 


//Get the root element 
Node company = doc.getFirstChild(); 

//Get the staff element , it may not working if tag has spaces, or 
    //whatever weird characters in front...it's better to use 
    //getElementsByTagName() to get it directly. 
//Node staff = company.getFirstChild(); 

    //Get the staff element by tag name directly 
    Node navPoint = doc.getElementsByTagName("navMap").item(0); 

//update staff attribute 

/*NamedNodeMap attr = navPoint.getAttributes(); 
Node nodeAttr = attr.getNamedItem("navPoint"); 

nodeAttr.setTextContent("2");*/ 

//append a new node to staff 
/*Element age = doc.createElement("age"); 
age.appendChild(doc.createTextNode("28")); 
staff.appendChild(age);*/ 

//loop the staff child node 
NodeList list = navPoint.getChildNodes(); 

for (int i =0; i<list.getLength();i++){ 

    Node node = list.item(i); 




    //get the salary element, and update the value 

      NamedNodeMap attr = node.getAttributes(); 

      if(attr != null){ 
      Node nodeAttr = attr.getNamedItem("playOrder"); 
       System.out.println(nodeAttr); 

      String aString = Integer.toString(i); 
      nodeAttr.setTextContent(aString); 
       } 

} 

//write the content into xml file 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
StreamResult result = new StreamResult(new File(filepath)); 
transformer.transform(source, result); 

System.out.println("Done"); 

    }catch(ParserConfigurationException pce){ 
pce.printStackTrace(); 
    }catch(TransformerException tfe){ 
tfe.printStackTrace(); 
    }catch(IOException ioe){ 
ioe.printStackTrace(); 
    }catch(SAXException sae){ 
sae.printStackTrace(); 
    } 
} 
} 
+0

值得一提的是,playOrder屬性在EPUB 2.0.1棄用,不再需要在所有。 EPX 3中也完全刪除了NCX。 – 2011-05-25 21:44:48

回答

0

我的猜測:navPoint.getChildNodes()變得比所述的navPoint元件多,中的XPath 「/ NCX/navMap /節點()」 中的氧的產率也是novPoint元件之間的(不可見)的文本節點。 因爲它們沒有屬性,所以if(attr != null)會跳過它們,因此只有每個第二個節點都被處理,因此只能使用第二個i值。

有沒有getChildElements()

最好的問候,

基督教

+0

感謝您幫助基督徒。 自從我發佈以來,我得出了完全相同的結論。在.ncx文件中清除所有空白區並不是一個很大的竅門,所以我做了。現在另一個問題,playOrder將從0開始。但我使用PlayOrder從0開始驗證ePub文件並且它工作正常。所以,白色空間的問題不是懸而未決的,但我有一些將PlayOrder排序的東西。 – gardefjord 2011-05-24 15:14:12