0

要素内にあると呼ばれる要素がある場合とない場合があるxmlファイルを解析して<Popular> います<EName>

例:

<Info>
<Enterprise>
<EName>
<Legal>Cool company</Legal>
</EName>
</Enterprise>
<Enterprise>
<EName>
<Legal>Cool company2</Legal>
<Popular>The company 2</Popular>
</EName>
</Enterprise>
</Info>

次のようにscala scales xmlを使用します。

val Info = NoNamespaceQName("Info")
val Enterprise = NoNamespaceQName("Enterprise")
val EName = NoNamespaceQName("EName")
val Legal = NoNamespaceQName("Legal")
val Popular = NoNamespaceQName("Popular")

val EnterprisePath = List(Info, Enterprise)

    val itr =  iterate(EnterprisePath, xml)
    for {
      enterprise <- itr
      enterpriseName <- enterprise \* EName \* Legal
      enterprisePopularName <- enterprise \* EName \* Popular 
    } {
      // Do fun stuff
      Logger.info("enterprise: "+enterpriseName + " "+enterprisePopularName)
}

何が起こるかというと、Popular 要素が存在しない場合、for ステートメントは実行されず、yield ステートメントは実行されません。

私が望むのは、最初に要素をチェックし、Popular 要素が空の場合は、enterprisePopularName を空の文字列に設定することです

何かのようなもの:

<- if((enterprise \* EName \* Popular)) enterprise \* EName \* Popular else ""      

しかし、私はそれを理解することはできません。私はscalaの初心者だからだと思います。

4

2 に答える 2

1

Impredicatives の回答は機能しますが、シーケンス内に少なくとも n 個の値があることを確認するために使用できる、Seqという素敵な小さなメソッドがあります。padToと の 2 つのパラメータが必要です。ここで、length: Intは含まれるタイプのサブタイプです。したがって、あなたの場合は次のようになります。elem: BBSeq

for {
  enterprise <- itr
  enterpriseName <- enterprise \* EName \* Legal
  enterprisePopularName <- (enterprise \* EName \* Popular).padTo(1, reasonableDefaultValue)
}
于 2013-04-17T10:20:00.097 に答える
0

警告: 私は「スケール」に精通していないため、ここの詳細は間違っている可能性があります。特に、次のことがわかります。

  • \*は a を返さないSeq- を返す可能性がありますIterable。その場合は単に に置き換えるか、何らかのカスタム コレクションSeqを返しIterableます。その場合は、以下のメソッドを変換する方法を考える必要があります。
  • おそらく、返されるシーケンスは、デフォルト値をノードとしてラップするか、デフォルト値を適用する前に ( を使用して) シーケンスを変換する必要がありSeq[Node]ます。Seq[String].map(_.toString)

\*ここでは、が何らかのシーケンス (Scala の ) を返すと想定していますSeqSeq必要なのは、とデフォルト値を取り、Seqが空の場合はデフォルト値を生成するメソッドです。これは、やメソッドに相当Optionするものを記述する場合にすぎないことに注意してください。orElsegetOrElse

これを行う方法の 1 つを次に示します。

def orIfEmpty[A](xs : Seq[A], default : A) : Seq[A] = 
  if (xs.isEmpty) Seq(default) else xs

そして今、これを内包表記で使うことができます:

enterprisePopularName <- orIfEmpty(enterprise \* EName \* Popular, "")
于 2013-04-17T10:32:41.753 に答える