首页 > 解决方案 > 有没有办法在 Elm 中遍历 XML 树?

问题描述

如果我有试图将 XML 数据转换为 Elm Html 的 XML 数据,有没有办法遍历 XML 树,寻找可能位于该树中任何位置的元素?例如,我想采用这个传入的 xml:

<root>
  <arbitrary>
    <numberOfTagsHere>
      <p>Lorem ipsum text goes here. May contain <tag foo="bar">some text</tag></p>
      <p>Maybe another paragraph here.</p>
    </numberOfTagsHere>
  </arbitrary>
</root>

做这样的事情:

<html>
  <div class="arbitrary">
  <div class="numberOfTagsHere">
    <p>Lorem ipsum text goes here. May contain <span class="foo bar">some text</span></p>
    <p>Maybe another paragraph here.</p>
  </div>
  </div>
</html>

这超出了 Elm 的范围吗?我应该改用 XSLT 吗?

我看到有像这样的 XML 解析库,但我并没有真正看到一种方法来走一棵树,一路转换标签。

标签: htmlxmlelm

解决方案


你提到的库是一个解码器,但我建议你在这里使用底层解析器。

您可以使用elm/parser构建自己的解析器来输出一棵树,您可以轻松地向下走并输出Html代表 html 的字符串或字符串。或者,您可以使用已经为您构建的一个。

https://github.com/jinjor/elm-xml-parser是一个不错的选择。我相信您在内部提到的 elm-xml-decode 包使用了它。

这是一个示例,说明您可能如何让 Elm 获取一个 html 字符串并使用 jinjor/elm-xml-parser 输出 Elm 自己的 Html 版本(该xmlToHtml函数特别显示了您如何“走下树”结构,由XmlParser):

import Html as H
import XmlParser

xmlToHtml : XmlParser.Node -> H.Html Never
xmlToHtml xmlNode =
    case xmlNode of
        XmlParser.Element tag attributes children ->
            -- do any mapping of the xml tag or attribute to what you want here!
            H.node tag [] (List.map xmlToHtml children)

        XmlParser.Text text ->
            H.text text


view : Model -> H.Html Never
view _ =
    let
        xml =
            """
            <arbitrary>
              <numberOfTagsHere>
                <p>Lorem ipsum text goes here. May contain <tag foo="bar">some text</tag></p>
                <p>Maybe another paragraph here.</p>
              </numberOfTagsHere>
            </arbitrary>
            """
    in
    Result.map
        (.root >> xmlToHtml)
        (XmlParser.parse xml)
        |> Result.withDefault (H.text "  Failed to parse the xml :(  ")

推荐阅读