2013-04-15 2 views
5

के कुछ कोड उदाहरण मैं इस समय बहुत बड़ी एक्सएमएल फ़ाइलें> 40 एमबी से कुछ पार्स कर रहा हूँ कहां ढूंढूं। मैंने अभी स्केल में विकास करना शुरू कर दिया है, इसलिए मैंने कुछ अच्छे libs के लिए नेट ब्राउज़ किया और स्कैला स्केल पर ठोकर खाई जो बड़ी फाइलों को संभालने में बहुत अच्छा लगता है।मैं तराजू 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

और फिर pullXml समारोह परीक्षण किया है, सुनिश्चित करें कि सभी libs सही तरीके से आयात कर रहे हैं।

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)   
     } 
    } 

यह परिणाम है कि पूरे फ़ाइल कंसोल के लिए मुद्रित किया जाता है! अच्छा! अब यह समय वस्तुओं को बनाने और डाटाबेस को बचाने के है, लेकिन मैं कैसे एक अच्छा तरीका में यह करने के लिए लोभी में समस्या हो रही है। मुझे वास्तव में कुछ अच्छे उदाहरण की आवश्यकता होगी।

ईजी। निम्नलिखित एक्सएमएल में कई एंटरप्राइज़ तत्व हैं जिनमें एक या कई स्थानीय यूनिट शामिल हो सकते हैं। यहां विचार स्थानीय एंटरप्राइज़ की सरणी के साथ एंटरप्राइज़ ऑब्जेक्ट बनाना है। जब अंत में एंटरप्राइज़ एंटरप्राइज़ ऑब्जेक्ट के साथ एंटरप्राइज़ ऑब्जेक्ट के साथ सेविंग विधि को एंटरप्राइज़ कॉल के साथ समापन विधि है।

<?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> 

इसे समेटने के लिए। दिए गए एक्सएमएल के लिए मुझे अपनी ऑब्जेक्ट्स बनाने के लिए pullXml का उपयोग कैसे करना चाहिए और उनके साथ सेव विधि को कॉल करना चाहिए?

उत्तर

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 में खींच lazily, इस समय और अधिक कठिन है आप प्रत्येक उपधारा जो एक LocalUnit नहीं है के लिए पथ को अलग करना होगा।

एचएच

+0

धन्यवाद! यह ठीक वही है जिसकी मुझे तलाश थी! पाठ() विधि यह है कि आपने स्वयं द्वारा घोषित किया है या यह स्केल में एक सहायक तरीका है? मेरा विचार आयात नहीं ढूंढ सकता है। – jakob

+1

ठीक है यह xpath.Functions.text() मिला। हम्म मेरा विचार यह क्यों हल नहीं करता? – jakob