首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用C#为lisp解析XML到S表达式?

如何使用C#为lisp解析XML到S表达式?
EN

Stack Overflow用户
提问于 2019-07-25 08:03:29
回答 1查看 273关注 0票数 2

我希望能够加载任何xml文件并将其转换为lisp的s表达式。有人知道如何使用c#来完成这个任务吗?

我以前没有使用lisp或s-表达式的经验,我的主要问题是我不知道如何在代码中表示s-表达式结构。

如果有任何提示,我会很感激的。

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

这就是我加载的内容:

代码语言:javascript
复制
<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>

这就是我想要得到的:

代码语言:javascript
复制
(document author: "paul@prescod.net"
  (para "This is a paragraph " (footnote "(better than the one under there)") ".")
  (para "Ha! I made you say \"underwear\"."))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-25 09:05:14

您可以在XmlReader上使用访问者模式遍历xml并生成S-表达式。此示例生成相当接近的输出(如果需要以字符串形式输出,则用Console对象替换StringBuilder对象):

代码语言:javascript
复制
   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);
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57197086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档