2012-01-13 14 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 .:これは例外です。

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 

が、それはあなたが期待するものはありませんか?私はloadFileの代わりにloadStringを使用しましたが、それはテスト用です。

+0

はい、これはloadFileを使用すると私が期待することです。しかし、利用可能であれば、要素の属性にもアクセスする必要があります。あなたはそれをどうやって知っていますか? – DaHanz

+1

omg、申し訳ありませんがすべて正常に動作し、問題は属性間の "、"でした。 :/ – DaHanz

関連する問題