Scala中特定XML节点中的明文?

时间:2016-07-20 05:52:29

标签: xml scala

我有一些看起来像这样的XML:

<a:feed>
     <a:id>http://localhost:8089/</a:id>
     <a:entry>
         <a:id>test1</a:id>
         <a:title/>
         <a:summary/>
         <a:updated>2016-07-05T13:34:37Z</a:updated>
         <a:author>
         <a:name/>
         </a:author>
         <a:link rel="edit" href="test1"/>
         <a:category>
     </a:entry>
     <a:entry>
         <a:id>test2</a:id>
         <a:title/>
         <a:summary/>
         <a:updated>2016-07-05T13:34:39Z</a:updated>
         <a:author>
         <a:name/>
         </a:author>
         <a:link rel="edit" href="test2"/>
         <a:category>
     </a:entry>
 </a:feed>

我想在Scala中加载此XML并删除<a:updated>标记中的所有文本。我怎样才能做到这一点?对Scala来说还是新手,无法弄清楚这一点。

1 个答案:

答案 0 :(得分:0)

previous question一样,您可以将RewriteRuleRuleTransformer结合使用。鉴于标签的特定形式,您可以直接对它们进行模式匹配。

val removeText = new RewriteRule {
  override def transform(n: Node): NodeSeq = n match  {
    case <a:updated>{_}</a:updated> => <a:updated></a:updated>
    case _ => n
  }
}

val output = new RuleTransformer(removeText).transform(xml)

但是,请注意您的输入XML有点格式错误 - <a:category>标记永远不会关闭。更正了,我在scala中进行了以下互动:

scala> val xml= <a:feed>
     |              <a:id>http://localhost:8089/</a:id>
     |              <a:entry>
     |                  <a:id>test1</a:id>
     |                  <a:title/>
     |                  <a:summary/>
     |                  <a:updated>2016-07-05T13:34:37Z</a:updated>
     |                  <a:author>
     |                  <a:name/>
     |                  </a:author>
     |                  <a:link rel="edit" href="test1"/>
     |                  <a:category/>
     |              </a:entry>
     |              <a:entry>
     |                  <a:id>test2</a:id>
     |                  <a:title/>
     |                  <a:summary/>
     |                  <a:updated>2016-07-05T13:34:39Z</a:updated>
     |                  <a:author>
     |                  <a:name/>
     |                  </a:author>
     |                  <a:link rel="edit" href="test2"/>
     |                  <a:category/>
     |              </a:entry>
     |          </a:feed>
xml: scala.xml.Elem = ..

scala> val output = new RuleTransformer(removeText).transform(xml)
output: Seq[scala.xml.Node] =
         <a:feed>
             <a:id>http://localhost:8089/</a:id>
             <a:entry>
                 <a:id>test1</a:id>
                 <a:title/>
                 <a:summary/>
                 <a:updated></a:updated>
                 <a:author>
                 <a:name/>
                 </a:author>
                 <a:link rel="edit" href="test1"/>
                 <a:category/>
             </a:entry>
             <a:entry>
                 <a:id>test2</a:id>
                 <a:title/>
                 <a:summary/>
                 <a:updated></a:updated>
                 <a:author>
                 <a:name/>
                 </a:author>
                 <a:link rel="edit" href="test2"/>
                 <a:category/>
             </a:entry>
         </a:feed/>