Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala如何检索具有可选属性的xml标记_Xml_Scala_Scala Xml - Fatal编程技术网

Scala如何检索具有可选属性的xml标记

Scala如何检索具有可选属性的xml标记,xml,scala,scala-xml,Xml,Scala,Scala Xml,我正在尝试获取带有属性的scala xml节点标记。我只想得到带有属性的标记名,而不是子元素 我有以下意见: <substance-classes> <nucleic-acid-sequence display-name="Nucleic Acid Sequence"> <nucleic-acid-base> <base-symbol>a</base-symbol>

我正在尝试获取带有属性的scala xml节点标记。我只想得到带有属性的标记名,而不是子元素

我有以下意见:

<substance-classes>
    <nucleic-acid-sequence display-name="Nucleic Acid Sequence">
        <nucleic-acid-base>
            <base-symbol>a</base-symbol>
            <count>295</count>
        </nucleic-acid-base>
        <nucleic-acid-base>
            <base-symbol>c</base-symbol>
            <count>329</count>
        </nucleic-acid-base>
        <nucleic-acid-base>
            <base-symbol>g</base-symbol>
            <count>334</count>
        </nucleic-acid-base>
        <nucleic-acid-base>
            <base-symbol>t</base-symbol>
            <count>268</count>
        </nucleic-acid-base>
    </nucleic-acid-sequence>
    <genbank-information>
        <genbank-accession-number>EU186063</genbank-accession-number>
    </genbank-information>
</substance-classes>

A.
295
C
329
G
334
T
268
EU186063
我试图通过这样做来替换
的内容

val newNucleicAcidSequenceNode = <nucleic-acid-sequence>{ myfunction 
} </nucleic-acid-sequence>
val newNucleicAcidSequenceNode={myfunction
} 
但是一些
具有类似
的属性。自从我
newNucleicAcidSequenceNode
是一个硬编码标记,我正在丢失属性

如何保留可选属性并将
{myfunction}
传递给
标签?

所以,如果我很了解你:

  • 您只想替换xml的一部分
  • 这部分是
    物质类别下任何
    核酸序列的子序列
  • 您不希望丢失上述核酸序列的任何属性
  • 通过函数(
    myFunction
    )更改上述子项
因此,我的答案是:

import scala.xml.{Node, Elem}

val myXml: Elem =
      <substance-classes>
        <nucleic-acid-sequence display-name="Nucleic Acid Sequence">
          <nucleic-acid-base>
            <base-symbol>a</base-symbol>
            <count>295</count>
          </nucleic-acid-base>
          <nucleic-acid-base>
            <base-symbol>c</base-symbol>
            <count>329</count>
          </nucleic-acid-base>
          <nucleic-acid-base>
            <base-symbol>g</base-symbol>
            <count>334</count>
          </nucleic-acid-base>
          <nucleic-acid-base>
            <base-symbol>t</base-symbol>
            <count>268</count>
          </nucleic-acid-base>
        </nucleic-acid-sequence>
        <genbank-information>
          <genbank-accession-number>EU186063</genbank-accession-number>
        </genbank-information>
      </substance-classes>

def myFunction(children: Seq[Node]) : Seq[Node] = ??? // whatever you want it to be

// Here's the replacement:

myXml.copy(child = myXml.child.map {
  case e@Elem(_, "nucleic-acid-sequence", _, _, children@_*) =>
    e.asInstanceOf[Elem].copy(child = myFunction(children))
  case other => other
})
在这种情况下,如果您将第一个代码段中未实现的
myFunction
替换为以下内容:

  <substance-classes>
    <nucleic-acid-sequence display-name="Nucleic Acid Sequence"><nucleic-acid-base>
        <base-symbol>c</base-symbol>
        <count>329</count>
      </nucleic-acid-base><nucleic-acid-base>
        <base-symbol>g</base-symbol>
        <count>334</count>
      </nucleic-acid-base></nucleic-acid-sequence>
    <genbank-information>
      <genbank-accession-number>EU186063</genbank-accession-number>
    </genbank-information>
  </substance-classes>

C
329
G
334
EU186063
正如您所见,
核酸序列的属性没有丢失,并且您的函数在定义的条件下保持了四个以上的两个节点

希望能有帮助

  <substance-classes>
    <nucleic-acid-sequence display-name="Nucleic Acid Sequence"><nucleic-acid-base>
        <base-symbol>c</base-symbol>
        <count>329</count>
      </nucleic-acid-base><nucleic-acid-base>
        <base-symbol>g</base-symbol>
        <count>334</count>
      </nucleic-acid-base></nucleic-acid-sequence>
    <genbank-information>
      <genbank-accession-number>EU186063</genbank-accession-number>
    </genbank-information>
  </substance-classes>