【问题标题】:How to convert List<string> to xml document in c#如何在 C# 中将 List<string> 转换为 xml 文档
【发布时间】:2013-09-11 06:35:56
【问题描述】:

我想在 c# 中将 List 转换为 xml 文档。

我的代码如下:

List<string> BugWSResponseList1 = new List<string>();
Logger.Write("\n\n" + DateTime.Now + " : " + " : START : Creation of a set of Bugs via bug.Add API");
BugWSResponseList1 = CreateBugs(FilePath_EXPRESS_API_BugAdd_CreateBugs_DataFile);
Logger.Write("\n\n" + DateTime.Now + " : " + " : END : Creation of a set of Bugs via bug.Add API");

我一直在尝试将列表响应转换为字符串,然后尝试将其转换为 xml 文档,但是当我解析它时,它显示 xml 中有多个根元素。

xml的格式如下:

<Bug>
      <family>ESG</family>
      <product>Dr.Watson</product>
      <version>Xpress API</version>
      <productarea>1</productarea>
      <subarea></subarea>
      <qe>sdawar</qe>
      <duplicateId></duplicateId>
</Bug>
<Bug>
      <family>TEST22</family>
      <product>Dr.Watson</product>
      <version>Xpress API</version>
      <productarea>1</productarea>
      <subarea></subarea>
      <qe>sdawar</qe>
      <duplicateId></duplicateId>
</Bug>

请注意,它在 xml 中有两个不同的节点。 到目前为止,我正在做的是将 List BugWSResponseList1 转换为字符串,然后将其加载为 xml。这是我正在做的代码:

XmlDocument xd = new XmlDocument();
                    string s = string.Join(",", BugWSResponseList2);                    
                    xd.LoadXml(s);

但是当我这样做时,它说 xml 中有多个根元素。

我想将 List BugWSResponseList1 转换为 xml 文档,因为我需要进一步解析它以执行代码。 任何帮助,将不胜感激。 谢谢

【问题讨论】:

  • xmlwriter,你的问题无法回答,怎么可能知道你的字符串是什么格式的?它们是有效的 xml 吗?需要解析吗?
  • 请同时提供您的列表样本。
  • 消息很清楚:there are more than one root element in the xml. 您的 xml 无效。
  • 一个xml必须有一个且只有一个根元素(有点像Highlander)。在您的情况下,xml 可能看起来像&lt;Bugs&gt;&lt;Bug&gt;...&lt;/Bug&gt;&lt;Bug&gt;...&lt;/Bug&gt;&lt;/Bugs&gt; - 另外,我假设 BugWSResponseList2 中的一个条目看起来像"&lt;Bug&gt;...&lt;/Bug&gt;"。所以用"," 加入它们不能产生有效的xml。
  • 我越来越觉得你没有完全理解 xml 的工作原理以及你应该如何使用它。例如,将节点作为字符串放入列表或您的其他问题中替换节点的值。我敦促您阅读Creating XML Trees,甚至可以从LINQ to XML Programming Guide 开始,并重新考虑您对整个事情的处理方式。

标签: c# xml tstringlist


【解决方案1】:

您可以使用 XElement 或 XDocument 和 LINQ。提供 XML 应该是什么样子的示例,我们可以提供更多信息。

例如:

BugWSResponseList1.Add("<Bug><family>TEST22</family><product>Dr.Watson</product><version>Xpress API</version><productarea>1</productarea><subarea></subarea><qe>sdawar</qe><duplicateId></duplicateId></Bug>");

BugWSResponseList1.Add("<Bug><family>ESG</family><product>Dr.Watson</product><version>Xpress API</version><productarea>1</productarea><subarea></subarea><qe>sdawar</qe><duplicateId></duplicateId></Bug>");

XElement xe = new XElement
              (
                  "Bugs",
                  BugWSResponseList1
                  .Select 
                  (
                      x=>
                      XElement.Parse(x)
                  )
              );

因此,在我使用您提供的两段 xml 加载列表后,我执行以下操作:

我创建了一个新的 XElement 来保存 XML 的根。我将该根命名为Bugs。然后作为那个根的孩子,我把你的 List 的内容解析成 XElement 对象。

上面的代码将导致:

<Bugs>
  <Bug>
    <family>TEST22</family>
    <product>Dr.Watson</product>
    <version>Xpress API</version>
    <productarea>1</productarea>
    <subarea></subarea>
    <qe>sdawar</qe>
    <duplicateId></duplicateId>
  </Bug>
  <Bug>
    <family>ESG</family>
    <product>Dr.Watson</product>
    <version>Xpress API</version>
    <productarea>1</productarea>
    <subarea></subarea>
    <qe>sdawar</qe>
    <duplicateId></duplicateId>
  </Bug>
</Bugs>

您缺少的是根元素。 XmlDocument 需要定义一个根元素。

在您的情况下,您可以在代码中通过添加连接字符串的开头和结尾来摆脱它,如下所示,但我认为我的解决方案更强大。

XmlDocument xd = new XmlDocument();
string s = "<Bugs>" + string.Join(",", BugWSResponseList2) + "</Bugs>";                    
xd.LoadXml(s);

【讨论】:

  • 请找到我在上面的查询中添加的示例 xml。谢谢。
  • 我们需要知道您的列表中有哪些数据可以提供预期结果
  • 我有两个不同的节点, 作为列表 响应中每个节点的根标记。我在上面添加的示例 xml 中指定了完整的列表响应。
  • 感谢您的解决方案。它真的让我更进一步。感谢您的所有帮助。
【解决方案2】:

遍历所有列表条目并使用 XMLSerializer 类创建一个 xml 文档。 一个很好的解释可以找到herehere

【讨论】:

  • list&lt;string&gt;{"a","b","c"} - 这不会产生有效的 xml 文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多