使用标准模块“ parsexml”,如何通过纯字符串流或字符串而不是文件来解析XML

时间:2018-07-16 03:36:02

标签: xml xml-parsing stringstream nim

https://nim-lang.org/docs/parsexml.html

文档仅使用open从文件字符串流进行解析,但是如果我只有一个纯字符串(例如httpclient client.get正文),我将如何处理。

2 个答案:

答案 0 :(得分:1)

我知道了!您实际上不应该使用parsexml。您将xmldomxmldomparserloadXML过程一起使用(传递字符串!)。

https://www.rosettacode.org/wiki/XML/XPath#Nim

答案 1 :(得分:1)

要在内存字符串中使用parsexml,必须使用streams module从字符串中创建流。 parsexml模块嵌入了一个示例以从文件中读取内容,以下是您需要更改以使其从字符串进行解析的行:

var filename = addFileExt(paramStr(1), "html")
let buffer = readFile(filename)
var s = newStringStream(buffer)
if s == nil: quit("cannot open the file " & filename)

完整示例如下:

import os, streams, parsexml, strutils

if paramCount() < 1:
  quit("Usage: htmltitle filename[.html]")

var filename = addFileExt(paramStr(1), "html")
let buffer = readFile(filename)
var s = newStringStream(buffer)
if s == nil: quit("cannot open the file " & filename)
var x: XmlParser
open(x, s, filename)
while true:
  x.next()
  case x.kind
  of xmlElementStart:
    if cmpIgnoreCase(x.elementName, "title") == 0:
      var title = ""
      x.next()  # skip "<title>"
      while x.kind == xmlCharData:
        title.add(x.charData)
        x.next()
      if x.kind == xmlElementEnd and cmpIgnoreCase(x.elementName, "title") == 0:
        echo("Title: " & title)
        quit(0) # Success!
      else:
        echo(x.errorMsgExpected("/title"))

  of xmlEof: break # end of file reached
  else: discard # ignore other events

x.close()
quit("Could not determine title!")