将列表转换为 XML

Posted

技术标签:

【中文标题】将列表转换为 XML【英文标题】:Converting a list into XML 【发布时间】:2012-08-13 03:26:21 【问题描述】:

对于我目前正在进行的一个项目,我得到了一个对象数组,每个对象都包含一个“内容”属性和一个“级别”属性。我需要将此列表转换为 html 项目符号列表。例如,如果给我以下输入(为简单起见以 JSON 显示):

[ content: "Hey", level: "1",
  content: "I just met you", level: "2",
  content: "and this is crazy", level: "2",
  content: "but here's my number", level: "1",
  content: "call me, maybe", level: "3" ]

我需要将其转换为以下 XHTML:

<ul>
  <li>Hey</li>
  <li>
    <ul>
      <li>I just met you</li>
      <li>and this is crazy</li>          
    </ul>
  </li>
  <li>but here's my number</li>
  <li>
    <ul>
      <li>
        <ul>
          <li>call me, maybe</li>      
        </ul>
      </li>
    </ul>
  </li>
</ul>

最终产品如下所示:

嘿 我刚认识你 这太疯狂了 但这是我的电话号码 给我打电话,也许( - 我认为我无法在 SO 中做到这一点)

有点奇怪的谜题。关于最有效/最容易实现的算法/方法的任何建议?我正在用 C# 实现这个,但是用另一种语言的例子/想法会更受欢迎。

【问题讨论】:

我很难不反对使用 call me maybe 歌词。 :) 你想要 HTML 还是 XML? @jrummell:我最终会想要 HTML,但如果有办法使用 XML 技术生成它,我相信我也可以构建它。 首先查看 C# 类 XmlDocument(因为您在 C# 下发布了此内容)。链接有它的 Microsoft 文档。此外,一个简单的谷歌搜索会出现很多关于如何做到这一点的例子。 Here's one @DougRamsey 你只需要大约 100 个代表就可以重新制作...我的意思是,编辑,歌词。 :) 【参考方案1】:

这里的思路是,只要层级大于等于前一个,就应该嵌套,如果小于,就应该关闭。

public string BuildLists(List<KeyValuePair<string, int>> pairs)

    int CurrentLevel = 1;
    StringBuilder s = new StringBuilder();

    s.Append("<ul>");

    foreach (KeyValuePair<string, int> pair in pairs)
    
        if(pair.Value > CurrentLevel)
        
            //Nest more
            for(int i = 0; i < pair.Value - CurrentLevel; i++)
            
                s.Append("<li><ul>");
            
        
        else if(pair.Value < CurrentLevel)
        
            //Close Tags
            for(int i = 0; i < CurrentLevel - pair.Value; i++)
            
                s.Append("</ul></li>");
            
        

        s.Append("<li>" + pair.Key + "</li>");

        CurrentLevel = pair.Value
    

    //Close everything.
    for(int i = 0; i < CurrentLevel - 1; i++)
    
        s.Append("</ul></li>");
    

    s.Append("</ul>");
    return s.ToString();

【讨论】:

我没有投反对票,但我猜投反对票的人这样做是因为您的解决方案缺少关闭一些标签。它产生以下输出:&lt;ul&gt;&lt;li&gt;Hey&lt;/li&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;I just met you&lt;/li&gt;&lt;li&gt;and this is crazy&lt;/li&gt;&lt;/li&gt;&lt;/ ul&gt;&lt;li&gt;but here's my number&lt;/li&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;call me, maybe&lt;/li&gt;&lt;/ul&gt; 这不是 OP 想要的,并且由于您尚未关闭您的 &lt;ul&gt;s 而无效。您是否针对给定的输入测试了您的代码? @DarinDimitrov 我忘了交换关闭标签的顺序。已编辑。 +1 表示一个可靠的想法。我想我可以解决这个问题。就像 Darin Dimitrox 提到的那样,它并没有完全产生正确的输出,但它给了我追求的线索。

以上是关于将列表转换为 XML的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 文件转换为具有列表的 XML 对象 [重复]

将对象列表转换为 xml 字符串

如何在 C# 中将嵌套列表转换为 XML

将 WebService 响应 (XML) 转换为数组或列表以显示在 MVC 列表上

使用嵌套列表将 XML 文件转换为 C# 对象

PostgreSQL 交叉表转置行到列