将列表转换为XML

时间:2012-08-16 18:03:27

标签: c# html xml arrays object

对于我正在处理的项目,我给出了一个对象数组,每个对象都包含一个“content”属性和一个“level”属性。我需要将此列表转换为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>

最终产品看起来像这样:

    • 我刚认识你
    • 这很疯狂
  • 但这是我的号码
    • 打电话给我,也许(&lt; - 更深层次 - 我认为我不能这样做)

有点怪异的谜题。关于最有效/易于实现的算法/方法的任何建议?我在C#中实现这一点,但是另一种语言的示例/想法将非常受欢迎。

1 个答案:

答案 0 :(得分:2)

这里的想法是,只要级别大于或等于前一级,它就应该嵌套,如果它更小,则应该关闭。

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();
}