2011-04-24 69 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> 

或类似的东西。