【问题标题】:How to parse an XML to S-Expression for lisp using C#?如何使用 C# 将 XML 解析为 lisp 的 S-Expression?
【发布时间】:2019-07-25 08:03:29
【问题描述】:

我希望能够加载任何 xml 文件并将其转换为 lisp 的 s-expression。有谁知道如何使用 c# 来完成这项工作?

我之前没有使用 lisp 或 s-expression 的经验,我的主要问题是我无法弄清楚如何在代码中表示 s-expression 结构。

如果有任何提示,我将不胜感激。

我正在考虑使用 linq to xml 并可能将此 xml 反序列化为 c# 对象,然后将其序列化为 s-expression,但我不确定这是否是正确的方法。

例如 这就是我加载的内容:

<document author="paul@prescod.net">
<para>This is a paragraph <footnote>(just a little one)</footnote>.</para>
<para>Ha! I made you say "underwear".</para>
</document>

这就是我想收到的:

(document author: "paul@prescod.net"
  (para "This is a paragraph " (footnote "(better than the one under there)") ".")
  (para "Ha! I made you say \"underwear\"."))

【问题讨论】:

    标签: c# xml parsing s-expression


    【解决方案1】:

    您可以在XmlReader 上使用访问者模式来遍历xml 并生成S-Expression。此示例生成非常接近的输出(如果需要作为字符串输出,请将 Console 替换为 StringBuilder 对象):

       var t = @"<document author=""paul@prescod.net"">
    <para>This is a paragraph <footnote>(better than the one under there)</footnote>.</para>
    <para>Ha! I made you say ""underwear"".</para>
    </document>";
    
        var xmlTextReader = XmlTextReader.Create(new StringReader(t));
    
        Visit(xmlTextReader, (XmlNodeType nodeType, XmlReader element) =>
        {
            switch (nodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine();
                    Console.Write(new string('\t', element.Depth));
                    Console.Write("(" + element.Name);
                    break;
                case XmlNodeType.Text:
                    if(!string.IsNullOrEmpty(element.Value))
                    {
                        Console.Write(@" """ + element.Value.Replace(@"""", @"\""") + @"""");
                    }
                    break;
                case XmlNodeType.EndElement:
                    Console.Write(")");
                    break;
                case XmlNodeType.Attribute:
                    Console.Write(" " + element.Name + @": """ + element.Value.Replace(@"""",@"\""") + @"""");
                    break;
            }
        });
    ...
    
    
    public static void Visit(XmlReader xmlReader, Action<XmlNodeType, XmlReader> visitor)
    {
        while (xmlReader.Read())
        {
            visitor(xmlReader.NodeType, xmlReader);
    
            if (xmlReader.NodeType == XmlNodeType.Element)
            {
                while (xmlReader.MoveToNextAttribute())
                {
                    visitor(xmlReader.NodeType, xmlReader);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多