2013-04-15 10 views
5

現在、40 MBを超える非常に大きなxmlファイルの解析を行っています。私はちょうどスカラで開発を開始したので、良いライブラリのためにネットを閲覧し、大きなファイルを扱う際には非常に良いと思われるScala Scalesを見つけました。Scales Xmlのコード例はどこにありますか

私が読んでいる:、 http://scala-scales.googlecode.com/svn/sites/scales/scales-xml_2.9.1/0.2/ScalesXmlIntro.html http://scala-scales.googlecode.com/svn/sites/scales/scales-xml_2.9.2/0.4.4/PullParsing.html

をしてから、すべてのlibsが正しくインポートされていることを確認するために、pullXml機能をテストしました。

val pull = pullXml(new FileReader("/Users/mycrazyxml/tmp/large.xml")) 
while(pull.hasNext){ 
    pull.next match { 
     case Left(i : XmlItem) => 
      // Handle XmlItem 
      Logger.info("XmlItem: "+i) 

     case Left(e : Elem) => { 
      // Handle Element 
      Logger.info("Element: "+e) 
     } 

     case Right(endElem) => 
      // Handle endElement 
      Logger.info("Endelement: "+endElem)   
     } 
    } 

この結果、ファイル全体がコンソールに出力されます。ニース! これで、オブジェクトを作成してdbに保存するときですが、これをどのようにして良い方法で行うのかを把握するのに、 の問題があります。私は実際にこれを行う方法の良い例が 必要になります。

例:以下のXMLには、1つまたは複数のLocalUnitで構成できる複数のEnterprise要素があります。 ここでの考え方は、LocalUnitsの配列でEnterpriseオブジェクトを作成することです。 endElementがエンタープライズコールの終了タグの場合、Enterpriseオブジェクトを使用したsaveメソッドはLocalUnitsで終了します。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Info SYSTEM "info.dtd"> 
<Info> 
    <Enterprise> 
    <RegNo>12345678</RegNo> 
    <Address> 
     <StreetInfo> 
     <StreetName>Infinite Loop</StreetName> 
     <StreetNumber>1</StreetNumber> 
     </StreetInfo> 
    </Address> 
    <EName> 
     <Legal>Crazy Company</Legal> 
    </EName> 
    <SNI> 
     <Code>00000</Code> 
     <Rank>1</Rank> 
    </SNI> 
    <LocalUnit> 
     <CFARNo>987654321</CFARNo> 
     <LUType>1</LUType> 
     <LUName>Crazy Company Gym</LUName> 
     <LUStatus>1</LUStatus> 
     <SNI> 
     <Code>46772</Code> 
     <Rank>1</Rank> 
     </SNI> 
     <SNI> 
     <Code>68203</Code> 
     <Rank>2</Rank> 
     </SNI> 
     <Address> 
     <StreetInfo> 
      <StreetName>Infinite Loop</StreetName> 
      <StreetNumber>1</StreetNumber> 
     </StreetInfo> 
     </Address> 
    </LocalUnit> 
    <LocalUnit> 
     <CFARNo>987654322</CFARNo> 
     <LUType>1</LUType> 
     <LUName>Crazy Company Restaurant</LUName> 
     <LUStatus>1</LUStatus> 
     <SNI> 
     <Code>46772</Code> 
     <Rank>1</Rank> 
     </SNI> 
     <SNI> 
     <Code>68203</Code> 
     <Rank>2</Rank> 
     </SNI> 
     <Address> 
     <StreetInfo> 
      <StreetName>Infinite Loop</StreetName> 
      <StreetNumber>1</StreetNumber> 
     </StreetInfo> 
     </Address> 
    </LocalUnit> 
    </Enterprise> 
<Enterprise> 
    <RegNo>12345671220</RegNo> 
    <Address> 
     <StreetInfo> 
     <StreetName>Cupertino Road</StreetName> 
     <StreetNumber>2</StreetNumber> 
     </StreetInfo> 
    </Address> 
    <EName> 
     <Legal>Fun Company HQ</Legal> 
    </EName> 
    <SNI> 
     <Code>00000</Code> 
     <Rank>1</Rank> 
    </SNI> 
    <LocalUnit> 
     <CFARNo>987654321</CFARNo> 
     <LUType>1</LUType> 
     <LUName>Fun Company</LUName> 
     <LUStatus>1</LUStatus> 
     <SNI> 
     <Code>46772</Code> 
     <Rank>1</Rank> 
     </SNI> 
     <SNI> 
     <Code>68203</Code> 
     <Rank>2</Rank> 
     </SNI> 
     <Address> 
     <StreetInfo> 
      <StreetName>Cupertino road</StreetName> 
      <StreetNumber>2</StreetNumber> 
     </StreetInfo> 
     </Address> 
    </LocalUnit>  
    </Enterprise> 
</Info> 

まとめてください。与えられたxmlに対して、私はどのように私のオブジェクトを作成し、それらと一緒にsaveメソッドを呼び出すためにpullXmlを使うべきですか?なまけそれぞれにLocalUnit引っ張る

答えて

2
val xmlFile = resource(this, "/data/enterprise_info.xml") 
val xml = pullXml(xmlFile) 

val Info = NoNamespaceQName("Info") 
val Enterprise = NoNamespaceQName("Enterprise") 
val LocalUnit = NoNamespaceQName("LocalUnit") 
val LocalUnitName = NoNamespaceQName("LUName") 
val EName = NoNamespaceQName("EName") 
val Legal = NoNamespaceQName("Legal") 

val EnterprisePath = List(Info, Enterprise) 

// iterate over each Enterprise 
// only an Enterprise at a time is in memory 
val itr = iterate(EnterprisePath, xml) 

for { 
    enterprise <- itr 
    enterpriseName <- enterprise \* EName \* Legal 
} { 
    println("enterprise "+text(enterpriseName) +" has units:") 
    for { 
    localUnits <- enterprise \* LocalUnit 
    localName <- localUnits \* LocalUnitName 
    }{ 
    println(" " + text(localName)) 
    } 
    //do a save 
} 

は、あなたがLocalUnitない各サブセクションのパスを区切る必要があり、現時点ではより困難です。

hth

+0

ありがとうございました!これはまさに私が探していたものでした! text()メソッドは、あなたが自分で宣言したものか、スケールでヘルパーメソッドですか?私のアイデアはインポートを見つけることができません。 – jakob

+1

OK xpath.Functions.text()が見つかりました。なぜ私のアイデアはこれを解決しないのですか? – jakob

関連する問題