2

我想解析此类数据的根元素如下

<elementA>
...
...anything
...
</ elementA>

<elementB>
   <!--anything such as same element name-->
   <elementB>hahahha</elementB>
</elementB>

< 
elementC
>
{
”aa“: 11,
}
</
elementC >

如果我解析成功,将返回一个列表,其结构类似于以下

[
 "elementA":"...\n...anything\n...",
 "elementB":"<!--anything such as same element name-->\n<elementB>hahahha</elementB>",
 "elementC":"{\n\”aa\“: 11,\n}",
]

我也参考了这个库dart-xml

这是我的核心解析逻辑

// 元素:空格 + < 空格 + 名 + 空格 + > + 内容 + </ + 空格 + 名  + 空格 + > + 空格)
  Parser element() => ref0(spaceOptional)
      .seq(RootToken.openElement.toParser())
      .seq(ref0(spaceOptional))
      .seq(ref0(wrapName))
      .seq(ref0(spaceOptional))
      .seq(RootToken.closeElement.toParser())
      .seq(ref0(content))
      .seq(RootToken.openEndElement.toParser())
      .seq(ref0(spaceOptional))
      .seq(ref0(wrapName))
      .seq(ref0(spaceOptional))
      .seq(RootToken.closeElement.toParser())
      .seq(ref0(spaceOptional)); 

但是不知道怎么解析内容,因为内容中包含任意字符,比如和根元素同名。</p>

还要感谢这个库dart-petitparser和作者,谢谢。

4

1 回答 1

1

您的代码看起来不错,我认为问题是如何定义内容生产,以便它消耗嵌套在元素中的所有内容?

根据您的具体要求,有多种方法。以下代码递归解析其他元素或任何其他字符。

Parser content() => (ref0(element) | any()).star();

如果您想研究一个完整的示例,请查看 GitHub 上的 XML 解析器

于 2021-05-20T17:06:07.163 回答