ポールのフォローアップの回答があなたの質問をほぼカバーしていることに気づきましたが、さらにいくつかの点を追加したいと思います。
- 私は個人的に Scala XML の設計が好きではなく、別のライブラリーScales Xmlを作成した程度ですが、設計が悪いとは言いません。その設計要素は、Anti-Xml のアプローチ (子を所有する要素、ノードをグループ化する概念など) の基礎を形成するのに十分なようですが、コンテナとしての属性とテキストが大きいという多くの癖があります。
- 私は最近、スケールに子孫軸をコミットしました-その貪欲な性質は、子孫または自己とは異なる動作をします-仕様によると、//para 1はロケーションパス/descendant::para 1と同じ意味ではありません
- Anti-Xml が存在しないか、若いプロジェクト (7 か月以上経ったか?) であり、子孫を追加することにまだ慣れていないため、不適切な設計を Anti-Xml に帰することができるかどうかはわかりません。
スケールの属性の質問に対する直接的な答えは次のとおりです。
val pre = Namespace("uri:test").prefixed("pre")
val elem = Elem("fred"l, emptyAttributes +
("attr", "value") +
Attribute(pre("attr"), "value"))
println("attributes are a map " + elem.attributes("attr"))
println("attributes are a set " + (
elem.attributes + ("attr", "new value")))
val xpath = top(elem) \@ pre("attr")
xpath foreach{ap => println(ap.name)}
与える
[info] attributes are a map Some(Attribute({}attr,value))
[info] attributes are a set ListSet(Attribute({}attr,new value), Attribute({uri:test}attr,value))
[info] {uri:test}attr
XPath 構文は、一致する属性に到達した任意の数のパスである可能性があるため、コレクションを返す必要があります。要素属性自体は、名前空間がないことを意味する「attr」と一致する QName と attr の localName です。追加の健全性のために、属性 QName は次のとおりです。
type AttributeQName = EitherLike[PrefixedQName, NoNamespaceQName]
コンパイラーは、QName だけが入ってくるローカル名がないことを確認します。
余談ですが、Scala XML XPath のような構文がおそらく面白くない理由は理解できますが、Scales for XPath based querying を参照してください。
XPath 1.0 文字列ベースのクエリ (スナップショット以外のバージョンにはまだプッシュされていません) と、コンパイラ/ide を利用できる内部 DSL の両方があります (さらに、はるかに高速で、scala コードを直接操作できるというボーナスもあります)。