2011-04-24 58 views
2

我試圖解析來自僞XML格式的文件中的文本。我可以得到一個DOM文檔的它時,它有如下結構:解析Java中的僞XML文件

<product> 
    <product_id>234567</product_id> 
    <description>abc</description> 
</product> 

當結構類似於下面我快到的問題發生:

<product> 
    <product_id>234567</product_id> 
    <description>abc</description> 
    <quantity 1:2> 
     <version>1.1</version> 
    </quantity 1:2> 
     <version>1.2</version> 
    <quantity 2:2> 
    </quantity 2:2> 
</product> 

它產生由於空間下面的例外<quantity 1:2>

org.xml.sax.SAXParseException:[Fatal Error] :1:167: Element type " quantity " must be followed by either attribute specifications, ">" or "/>" 

我可以用下劃線替換空間解決這個問題。問題是結構的大小可能有所不同,並且包含幾個具有相同格式的子節點(<node 1:x>),並且該文件可以包含數百個要解析的結構。有沒有可用的類來解析這樣的文本返回一個樹狀對象?

回答

1

它產生了以下異常由於<quantity 1:2>

的空間這不是錯誤的根本原因,根本原因是,因爲人們已經提到,你的文件格式無效XML。一個有效的XML標籤看起來像<quantity attr1="val1" attr2="val2>

這聽起來像你無法控制文件格式。在這種情況下,我認爲最簡單的方法是將預處理的文件轉換成有效的XML,然後有DOM/SAX解析器解析它:

FileInputStream file = new FileInputStream("pseudo.pxml"); 
ByteArrayOutputStream temp = new ByteArrayOutputStream(); 
int c = -1; 

while ((c=file.read()) >= 0){ 
    temp.write(c); 
} 

String xml = new String(temp.toByteArray()); 
xml = xml.replaceAll("([^:\s]+:[^:\s]+)", "value=\"\\1\""); 

ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.getBytes()); 

/* use xmlIn for your XML parsers */ 

請注意,我沒有測試此代碼也不是優化的;只是想給你一個想法。

+0

我創建了一個類來將該文件預處理爲有效的XML。 – Mane 2012-03-07 22:59:12

4

預處理該文件並將該元素用該x:y格式更改爲<element value="x:y"/>,那麼您的DOM/SAX解析器將不會窒息。

我建議使用正則表達式來幫助,但that way leads to madness

4

您的文件根本不是XML,SAX是XML(Simple API for XML)。你應該重新考慮你的結構,所以你可以做這樣的事情:

<quantity myAttr="1.2"> 
    <version>1.2</version> 
</quantity> 
<quantity myAttr="1.x"> 
    <version>1.1</version> 
</quantity> 
<version>1.0</version> 

或類似的東西。