2011-11-21 103 views
2
解析XML不带引号

我试图解析使用Scala一些产生不良的XML代码看起来像这样:在斯卡拉

<contextfile concordance=brown> 
<context filename=br-a01 paras=yes> 
<p pnum=1> 
<s snum=1> 
<wf cmd=ignore pos=DT>The</wf> 
</s> 
</p> 
... 

它的结构良好,但你可以看到有周围任何的没有引号attribube值。 Simplying与下面的Scala代码段抛出一个没有那么惊喜的错误打开文件:

val semCor = XML.loadFile(args(0)) 

抛出

org.xml.sax.SAXParseException: Open quote is expected for attribute "{1}" associated with an element type "concordance". 

我想知道怎么样,如果可能的话,设置斯卡拉XML解析器正确解析此输入,就好像引号围绕属性值一样。

感谢您的任何建议!

+0

呃,有没有办法改变XML呢?这当然会更容易,并保持XML达到标准。 – John

回答

6

不可能给解析器配置为Scala中那种程度。但是,由于您的XML格式不正确,因此可以使用HTML整洁库(如JSoupTagSoup)先整理XML,然后使用Scala XML对其进行解析。或者直接使用JSoup从XMl获取想要的数据。

+0

这就是我的预期,但并不希望。感谢整洁的图书馆,我会看到他们如何处理我的输入文件。 – fozziethebeat

+1

为了记录,[TagSoup](http://home.ccil.org/~cowan/XML/tagsoup/)是**完全**我正在寻找。它自动添加了急需的报价。谢谢@Matthew! – fozziethebeat

0

无法配置解析器。您的解析器不会接受“格式不正确”的XML。也许你应该考虑第一遍来添加引号。在一般情况下,这是不可能知道如何处理这个问题,但它可以在特定的情况下很容易的,例如,如果属性值不包含任何空白,报价,“&”或“<”字。

2

为什么您将此称为XML?事实并非如此。您不妨将Scala程序称为C#程序。 XML解析器根本就没有任何意义。您正在为您的数据交换使用完全专有的格式,并且您有两种选择:转而使用XML,或者为其编写完全专有的解析器。

+0

因为它**是** xml,它只是有一套系统性的语法错误。 – fozziethebeat

+2

@fozziethebeat它不是XML,因为它不遵循XML规范。充其量是“可能的XML”。迈克所在的地方是,使用格式不明确的格式可能会很危险,因此最好是修复问题的根源并实际使用XML,或者确保清楚地指定格式。但是,它不会是XML。 – ebruchez