簡體   English   中英

用Java解析偽XML文件

[英]Parsing pseudo XML file in Java

我正在嘗試解析來自偽XML格式的文件中的文本。 當它出現在以下結構中時,我可以從中獲取DOM文檔:

<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> ),並且該文件可以包含數百個要解析的結構。 是否有一個類可以解析像這樣的文本返回一個類似樹的對象?

預處理文件並使用x:y格式將<element value="x:y"/>更改為<element value="x:y"/>然后您的DOM / SAX解析器不會阻塞。

我建議使用正則表達式來幫助,但這會導致瘋狂

您的文件不是XML可言,而SAX是XML(XML的簡單API)。 您應該重新考慮您的結構,以便您可以執行以下操作:

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

或類似的東西。

由於<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 */

請注意,我沒有測試此代碼,也沒有進行優化; 只想給你一個主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM