如何根据 Scala 中不同的 XML 属性名称传递自定义模式

How to pass through a custom schema depending on different XML attribute names in Scala

我需要为下面的 XML 定义自定义架构。每个 TABLE 属性都有不同的列,因此我想为每个属性定义不同的自定义架构。

<CASE>
    <TABLE attrname="Wood">
        <ROWDATA>
            <ROW Weight="55" Length="11" color="Black"/>
        </ROWDATA>
    </TABLE>
    <TABLE attrname="Metal">
        <ROWDATA>
            <ROW Type ="AL" Weight="66" Length="23" Unit="0" />
            <ROW Type ="AL" Weight="44" Length="22" Unit="0"/>
            <ROW Type ="AL" Weight="33" Length="21" Unit="1"/>
        </ROWDATA>
    <TABLE attrname="Plastic">
        <ROWDATA>
            <ROW color="Blue" Grade="A" Price="112"/>
        </ROWDATA>
    </TABLE>
<CASE>

这可以用来读取XML,但是有没有办法在检查属性名称后读取它?例如,如果 table 属性名称是“Plastic”,那么我想使用以下架构来读取 XML.

val xmlDFF = session.read
.option("rootTag", "CASE")
.option("rowTag", "TABLE")
.schema(getPlasticSchema)
.xml(filePath)

def getPlasticSchema: StructType = {


    val rowType = new StructType()
       .add("_color", StringType)
       .add("_Grade", StringType)
       .add("_Price", StringType)

     val rowDataType = new StructType()
       .add("ROW", ArrayType(rowType))

     val tableTypePlastic = new StructType()
       .add("_attrname", StringType)
       .add("ROWDATA", rowDataType)
       
    tableTypePlastic
       
}

It 看起来不像 可以在阅读时进行过滤。但是你可以在:

之后做
.xml(filePath)
.filter("_attrname = 'Plastic'")