val template = <root>
<component>
<mother-board>
<manufacturer>
<name>
</name
</manufacturer>
<price>
555
</price>
<chipset>
Intel
</chipset>
</mother-board>
</component>
</root>
val xPaths = Map("root/component/mother-board/manufacturer/name" -> "Asus")
val output = <root>
<component>
<mother-board>
<manufacturer>
<name>
Asus
</name>
</manufacturer>
<price>
555
</price>
<chipset>
Intel
</chipset>
</mother-board>
</component>
</root>
実際のテンプレートは 250 行を超え、設定する必要がある xpath の数は 70 を超えています。これを達成できるライブラリまたはその他のアプローチに関する提案は大歓迎です。ありがとうございました。
私のアプローチに関する情報を追加するために更新してください
。しかし、XPath が処理される順序が変更されると、XML も変更され、私のユース ケースでは受け入れられません。
object Main extends App {
val props = Map(
"a/b/c" -> "val1",
"a/b/d/f" -> "val3",
"a/b/d/e" -> "val2"
)
println(props.keys.foldLeft(<root/>: Node)((acc, current) => {
create(Elem(acc.prefix, acc.label, acc.attributes, acc.scope, true, acc.child: _*), current.split("/").toList, current, props)
}))
def create(node: Elem, path: List[String], completePath: String, propMap: Map[String, String]): Node = {
if(path.size > 0) {
val current = path.head
node.child.filter(x => x.label.equals(current)).headOption.map(childToTraverse => {
val newChild = create(Elem(null, childToTraverse.label, childToTraverse.attributes, childToTraverse.scope, false, childToTraverse.child: _*), path.tail, completePath, propMap)
node.copy(child = node.child.filter(x => !x.label.equals(current)) ++ newChild)
}).getOrElse({
val newNode = Elem(null, current, node.attributes, node.scope, false)
val newChild = create(newNode, path.tail, completePath, propMap)
node.copy(child = node.child ++ newChild)
})
}
else {
node.copy(child = new Text(propMap.get(completePath).getOrElse("Value Not Available")))
}
}
}
問題:
入力用:
"a/b/c" -> "val1",
"a/b/d/f" -> "val3",
"a/b/d/e" -> "val2"
以下を生成します。
<root>
<a>
<b>
<c>
val1
</c>
<d>
<f>
val3
</f>
<e>
val2
</e>
</d>
</b>
</a>
</root>
入力用:
"a/b/c" -> "val1",
"a/b/d/e" -> "val2",
"a/b/d/f" -> "val3"
以下を生成します。
<root>
<a>
<b>
<c>
val1
</c>
<d>
<e>
val2
</e>
<f>
val3
</f>
</d>
</b>
</a>
</root>
異なる順序で処理された同一の XPath から生成された 2 つの XML の違いに注目してください。
正しい順番を知っています。そのため、XML をゼロから生成するのではなく、テンプレートを用意し、XPath に基づいてテンプレートを変更したいと考えました。