scala - 使用 Scala 解析 XML

标签 scala xpath xml-parsing

我有以下要使用 Scala 解析的 XML 文件:

<infoFile xmlns="http://latest/nmc-omc/cmNrm.doc#info" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://latest/nmc-omc/cmNrm.doc#info schema\pmResultSchedule.xsd">
   <fileHeader fileFormatVersion="123456" operator="ABCD">
       <fileSender elementType="MSC UTLI"/>
       <infoCollec beginTime="2011-05-15T00:00:00-05:00"/>
   </fileHeader>

<infoCollecData>
    <infoMes infoMesID="551727">
        <mesPeriod duration="TT1234" endTime="2011-05-15T00:30:00-05:00"/>
        <mesrePeriod duration="TT1235"/>
        <mesTypes>5517271 5517272 5517273 5517274 </measTypes>
        <mesValue mesObj="RPC12/LMI_ANY:Label=BCR-1232_1111, ANY=1111">
           <mesResults>149 149 3 3 </mesResults>
        </mesValue>
    </infoMes>

    <infoMes infoMesID="551728">
        <mesTypes>6132413 6132414 6132415</mesTypes>
        <mesValue measObjLdn="RPC12/LMI_ANY:Label=BCR-1232_64446, CllID=64446">
            <mesResults>0 0 6</mesResults>
        </mesValue>
        <mesValue measObjLdn="RPC13/LMI_ANY:Label=BCR-1232_64447, CllID=64447">
            <mesResults>0 1 6</mesResults>
        </mesValue>
    </infoMes>

    <infoMes infoMesID="551729">
        <mesTypes>6132416 6132417 6132418 6132419</mesTypes>
        <mesValue measObjLdn="RPC12/LMI_ANY:Label=BCR-1232_64448, CllID=64448">
            <mesResults>1 4 6 8</mesResults>
        </mesValue>
        <mesValue measObjLdn="RPC13/LMI_ANY:Label=BCR-1232_64449, CllID=64449">
            <mesResults>1 2 4 5 </mesResults>
        </mesValue>
        <mesValue measObjLdn="RPC13/LMI_ANY:Label=BCR-1232_64450, CllID=64450">
            <mesResults>1 7 8 5 </mesResults>
        </mesValue>
    </infoMes>
</infoCollecData>

我希望文件被解析如下:

我希望能够从 fileHeader 中提取运算符名称,然后提取 beginTime。

下一个场景 ****提取包含CllID的信息然后分别得到它的mesTypes和mesResults ****

因为文件包含许多不同的 CllID 所以我想要这样的最终结果

 CllID   date           time        mesTypes    mesResults 

64446   2011-05-15    00:00:00      6132413       0

64446   2011-05-15    00:00:00      6132414       0

64446   2011-05-15    00:00:00      6132415       6

64447   2011-05-15    00:00:00      6132413       0

64447   2011-05-15    00:00:00      6132414       1

64447   2011-05-15    00:00:00      6132415       6

我怎样才能做到这一点?到目前为止,这是我尝试过的:

import java.io._

import scala.xml.Node

object xml_parser {

  def main (args:Array[String]) = {
    val input_xmlFile = scala.xml.XML.loadFile("C:/Users/ss.xml")


    val fileHeader = input_xmlFile \ "fileHeader"
    val vendorName = input_xmlFile \ "fileHeader" \ "@operator"
    val dateTime = input_xmlFile \ "fileHeader" \  "infoCollec"   \"@beginTime"

    val date = dateTime.text.split("T")(0)
    val time = dateTime.text.split("T")(1).split("-")(0)

    val CcIds = (input_xmlFile \ "infoCollecData" \ "infoMes" \\ "mesTypes" )
    val cids = CcIds.text.split("\\s+").toList
    al CounterValues = (input_xmlFile  \ "infoCollecData" \\ "infoMes" \\ "mesValue" \\ "@meaObj")

    println(date);println(time);print(cids)

最佳答案

我可以建议 kantan.xpath ?它似乎应该很容易解决您的问题。

假设您的 XML 数据在文件 data 中可用,您可以这样写:

import kantan.xpath.implicits._

val xml = data.asUnsafeNode

// Date format to parse dates. Put in the right format.
// Note that this uses java.util.Date, you could also use the joda time module.
implicit val format = ???

// Extract the header data
xml.evalXPath[java.util.Date](xp"//fileheader/infocollec/@begintime")
xml.evalXPath[String](xp"//fileheader/@operator")

// Get the required infoMes nodes as a list, turn each one into whatever data type you need.
xml.evalXPath[List[Node]](xp"//infomes/mesvalue[contains(@measobjldn, 'CllID')]/..").map { node =>
    ...
}

使用正确的正则表达式提取CllID 位并不复杂,您可以使用标准的Scala Regex 类或kantan.regex对于类型更安全的东西,但在这里可能有点矫枉过正。

关于scala - 使用 Scala 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37611239/

相关文章:

c# - 如何从 C# 中引用带有美元符号的标识符?

java - 选择给定节点下某种类型的所有节点

php - 无法从 PHP 读取大型 XML 文件

c# - 使用 C# 将 JSON 转换为 XML

generics - 计算 Scala 泛型类 'equals' 方法中的类型参数... list 是唯一的方法吗?

algorithm - 理解 List.fold_left 并使用它实现插入排序

c# - 如何使用C#读取xml节点名称

python - selenium能否将aria-uuid识别为对象识别的ID?

java - 使用继承和 Java 接口(interface)使用为 Java 创建 XML 模式

scala - 使用spray/scala从post请求中获取表单参数