加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 我在哪里可以找到Scales Xml的一些代码示例

发布时间:2020-12-16 18:30:13 所属栏目:安全 来源:网络整理
导读:我正在解析非常大的xml文件 40 MB.我刚刚开始使用 scala进行开发,所以我浏览了一些好的库,并偶然发现了 Scala Scales,它似乎非常擅长处理大文件. 我读过了: http://scala-scales.googlecode.com/svn/sites/scales/scales-xml_2.9.1/0.2/ScalesXmlIntro.html
我正在解析非常大的xml文件> 40 MB.我刚刚开始使用 scala进行开发,所以我浏览了一些好的库,并偶然发现了 Scala Scales,它似乎非常擅长处理大文件.

我读过了:
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函数,以确保正确导入所有库.

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具有多个Enterprise元素,这些元素可以包含一个或多个LocalUnit.
这里的想法是使用LocalUnits数组创建一个Enterprise对象.什么时候
endElement是Enterprise的结束标记,使用带有LocalUnits的Enterprise对象调用save方法.

<?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,我应该如何使用pullXml来创建我的对象并使用它们调用save方法?

解决方法

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目前比较困难,你必须为每个不属于LocalUnit的子部分分别路径.

心连心

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读