2012-01-13 63 views
1

我嘗試迭代XML文件以獲取特定類型的所有元素<Card>。這種類型也可以具有可選的屬性。如何迭代可以具有可選屬性的XML元素?

XML示例:

<Lesson> 
    <Description>Description</Description> 
    <Card learnedTimestamp="1234567", isRepeatedByTyping="true", batch="5"> 
     <FrontSide>Foo1</FrontSide> 
     <ReverseSide>Bar1</ReverseSide> 
     <InformationLine>Info1</InformationLine> 
    </Card> 
    <Card> 
     <FrontSide>Foo2</FrontSide> 
     <ReverseSide>Bar2</ReverseSide> 
     <InformationLine>Info2</InformationLine> 
    </Card> 
</Lesson> 

Scala代碼:

class XMLParser(fqFileName: String) { 
     val pauDoc: Elem = XML.loadFile(fqFileName) 
     def printXMLFile() = { 
     var cardCount = 0 
     val lesson = (pauDoc \\ "Lesson")  
     for(val card <- lesson \\ "Card"){  
      cardCount = cardCount + 1 
      println("Card No " + cardCount) 
      val frontSide = (card \\ "FrontSide").text 
      println("FrontSide Value: " + frontSide)  
      val reverseSide = (card \\ "ReverseSide").text 
      println("ReverseSide Value.text: " + reverseSide)  
      val infoLine = (card \\ "InformationLine").text 
      println("InformationLine Value: " + infoLine)  
     }  
     } 
    } 

但這個代碼,如果<Card>元素沒有任何屬性纔有效。有人知道我如何處理屬性,特別是如果它們是可選的?

P.S .:這是我得到的例外。

Exception in thread "main" org.xml.sax.SAXParseException: Element type "Card" must be followed by either attribute specifications, ">" or "/>". 
     at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
     at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.seekCloseOfStartTag(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
     at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
     at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
     at javax.xml.parsers.SAXParser.parse(Unknown Source) 
     at scala.xml.factory.XMLLoader$class.loadXML(XMLLoader.scala:40) 
     at scala.xml.XML$.loadXML(XML.scala:40) 
     at scala.xml.factory.XMLLoader$class.loadFile(XMLLoader.scala:49) 
     at scala.xml.XML$.loadFile(XML.scala:40) 
     at de.htwg_konstanz.ecardman.common.XMLParser.<init>(XMLParser.scala:7) 
     at de.htwg_konstanz.ecardman.common.XMLParserMain$.main(XMLParserMain.scala:23) 
     at de.htwg_konstanz.ecardman.common.XMLParserMain.main(XMLParserMain.scala) 

回答

1

這對我的作品在2.9.1:

val raw = """<Lesson> 
    <Description>Description</Description> 
    <Card learnedTimestamp="1234567" isRepeatedByTyping="true" batch="5"> 
     <FrontSide>Foo1</FrontSide> 
     <ReverseSide>Bar1</ReverseSide> 
     <InformationLine>Info1</InformationLine> 
    </Card> 
    <Card> 
     <FrontSide>Foo2</FrontSide> 
     <ReverseSide>Bar2</ReverseSide> 
     <InformationLine>Info2</InformationLine> 
    </Card> 
</Lesson>""" 

class XMLParser(fqFileName: String) { 
    import xml._ 
    val pauDoc: Elem = XML.loadString(fqFileName) 
    def printXMLFile() = { 
    var cardCount = 0 
    val lesson = (pauDoc \\ "Lesson")  
    for(card <- lesson \\ "Card"){  
     cardCount = cardCount + 1 
     println("Card No " + cardCount) 
     val frontSide = (card \\ "FrontSide").text 
     println("FrontSide Value: " + frontSide)  
     val reverseSide = (card \\ "ReverseSide").text 
     println("ReverseSide Value.text: " + reverseSide)  
     val infoLine = (card \\ "InformationLine").text 
     println("InformationLine Value: " + infoLine)  
    }  
    } 
} 

new XMLParser(raw).printXMLFile() 

此打印:

Card No 1 
FrontSide Value: Foo1 
ReverseSide Value.text: Bar1 
InformationLine Value: Info1 
Card No 2 
FrontSide Value: Foo2 
ReverseSide Value.text: Bar2 
InformationLine Value: Info2 

是不是你期待什麼?我只是用loadString而不是loadFile,但那只是爲了測試。

+0

是的,這就是我所期望的,如果我使用loadFile。但是我也需要訪問元素的屬性(如果可用)。你知道如何做到這一點? – DaHanz 2012-01-13 09:30:21

+1

omg,抱歉一切正常,問題是屬性之間的「,」。 :/ – DaHanz 2012-01-13 10:14:50

相關問題