2011-04-19 53 views
3

我被要求編寫一個實用程序來搜索大量XML文件以查找缺少屬性的元素。負責部門不能僅僅在DTD中強制屬性,因爲它會破壞數百個文件。他們想要在幾天/周內手動編輯它們。Scala XML解析器和位置

我在Scala 2.8.1中編寫了一個小命令行工具。我將使用「拉」解析器,以便我可以保持我的代碼功能 - 編程純粹並運行它多線程。

我需要XML事件的位置。 Java 6(javax.xml.stream. XMLStreamReader)中提供的API具有返回事件行號的方法(getLocation())。我可以使用它來編寫消息,通知用戶在哪裏查找缺少的屬性。

我寧願在scala.xml.pull.XMLEventReader中使用pull語法分析器,但它似乎沒有提供位置信息。

我錯過了什麼嗎?它在Scala API中的其他地方嗎?

+0

可能重複的[如何跟蹤XML元素的源代碼行?](http://stackoverflow.com/questions/4446137/how-to-track-the-source-line-of-an-xml-元素) – 2011-04-19 13:23:57

+0

我很驚訝這個問題的(原始)副本在相關鏈接列表中有多低。我會嘗試編輯它的標題以使其更接近。 – 2011-04-19 13:25:53

+0

呃。我沒有看到我認爲原來的問題是一個完整的XML加載器,而這是關於_pull_ reader的。抱歉。如果可能的話,我會收回我的選票。 – 2011-04-19 13:49:50

回答

3

據我所見,這不是由XMLEventReader api提供的。

它依靠io.Source,可以提供訪問的位置,但沒有。我沒有看到一個簡單的方法來解決這個問題,因爲可以訪問該職位的對象是私人的。

您可能希望製作自己的XMLEventReader副本,該副本可以生成具有該職位的自定義XMLEvent。修改方法爲 override def elemStart,該方法可以訪問該位置,並可在每個EvElemStart之後生成另一個EvPos(line:Int, column:Int)

您也可以考慮使用2.9.RC1,因爲某些與性能相關的bug已修復。

+0

請參閱https://gist.github.com/930315 – huynhjl 2011-04-20 06:51:13