【问题标题】:Parse XML in Scala在 Scala 中解析 XML
【发布时间】:2016-04-06 01:11:12
【问题描述】:

输入

数据中的 XML 输入

val data = <Doc><Title>Doc</Title><Type><Type level="0">A</Type><Type level="1">B</Type></Type><Type><Type level="0">C</Type><Type level="1">D</Type><Type level="2">E</Type></Type></Doc>

期望的输出

Title : Doc
Type_1 : A | B
Type_2 : C | D | E

我的尝试

对于标题 - (data // "Title").text

问题在于 XML 中的“类型”标签

需要将每个类型标签组合在一起

下面是所有尝试提取类型并将它们分组为上述所需结果的命令的屏幕截图。

需要一些关于我们如何根据所需结果对类型标签进行分组的指导/逻辑。

【问题讨论】:

    标签: xml scala xpath xml-parsing


    【解决方案1】:

    初始数据:

    scala> val data = <Doc><Title>Doc</Title><Type><Type level="0">A</Type><Type level="1">B</Type></Type><Type><Type level="0">C</Type><Type level="1">D</Type><Type level="2">E</Type></Type></Doc>
    data: scala.xml.Elem = <Doc><Title>Doc</Title><Type><Type level="0">A</Type><Type level="1">B</Type></Type><Type><Type level="0">C</Type><Type level="1">D</Type><Type level="2">E</Type></Type></Doc>
    

    在 XML 中如下所示:

    <Doc>
        <Title>Doc</Title>
        <Type>
            <Type level="0">A</Type>
            <Type level="1">B</Type>
        </Type>
        <Type>
            <Type level="0">C</Type>
            <Type level="1">D</Type>
            <Type level="2">E</Type>
        </Type>
    </Doc>
    

    标签Type的所有节点都带有投影level属性和对应的值:

    scala> val types = (data \ "Type" \ "Type") map (x => (x \ "@level").text -> x.text)
    types: scala.collection.immutable.Seq[(String, String)] =
    List((0,A), (1,B), (0,C), (1,D), (2,E))
    

    level分组:

    types.groupBy(_._1).map { case (level, elems) => level -> elems.map(_._2) }
    res3: scala.collection.immutable.Map[String,scala.collection.immutable.Seq[String]] =
    Map(2 -> List(E), 1 -> List(B, D), 0 -> List(A, C))
    

    如果您希望按要求进行分组:

    Type_1 : A | B
    Type_2 : C | D | E
    

    然后:

    scala> (data \ "Type").zipWithIndex.map {case (s, idx) => idx -> (s \ "Type").map(_.text) }
    res4: scala.collection.immutable.Seq[(Int, scala.collection.immutable.Seq[String])] =
    List((0,List(A, B)), (1,List(C, D, E)))
    

    但这对我来说感觉不对,因为在 XML 中元素/节点的顺序通常不重要。

    【讨论】:

    • 非常感谢!!我将在同一方面进行更多探索……没错。但是您知道我们无法更改 XML,因为此源文件正在被其他应用程序团队使用...
    • 为了便于阅读,我将其分成 2 份。您可以用上面的表达式替换“类型”变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2019-10-23
    相关资源
    最近更新 更多