我有一个字符串数组。我正在尝试将它们写入元素。当我创建一个新元素时,它按照预期的方式工作,当我尝试SetElementValue时,它不会。任何帮助,将不胜感激。我甚至不知道该怎么看。
正常工作:
new XElement("tags", blog.tags.Select(x =>
new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x)))))
Xml文件中的结果:
<tags>
<tag><![CDATA[tag1]]></tag>
<tag><![CDATA[tag2]]></tag>
<tag><![CDATA[tag3]]></tag>
<tag><![CDATA[tag4]]></tag>
</tags>
当我尝试更新时出现问题:
不工作:
xBlog.SetElementValue("tags", blog.tags.Select(x =>
new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x)))));
结果:
<tags>System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]</tags>
完全亏损。请帮忙。谢谢你们!
对于Simplicity我尝试了没有AddCDATAElements和SanitizeXMLString但仍然完全相同的结果
xBlog.SetElementValue(“tags”,blog.tags.Select(x =&gt; new XElement(“tag”,x)));
System.Linq.Enumerable + WhereSelectArrayIterator`2 [System.String,System.String]
答案 0 :(得分:3)
在第一种情况下,您将IEnumerable
传递给构造函数,代码足够聪明,可以弄清楚您正在做什么并在其上循环。我看了一下构造函数(使用ReSharper),看来如果你传递的是IEnumerable,它会循环并为列表中的每个项创建一个XNode
。
在第二种情况下,您将IEnumerable传递给SetElementValue
。但它不会检查参数是否为IEnumerable。它执行一些基本类型检查以查看它是否为字符串,int等,最后它只调用ToString
,在您的情况下,它返回由blog.tags.Select(x => ...)
生成的变量类型的名称
首先将结果存储在列表中,然后循环应该可以解决问题,但是我不知道你想对列表中的每个项目做什么。
var elements = blog.tags.Select(x =>
new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x))))
foreach (var element in elements)
{
// do something with each element
}
答案 1 :(得分:0)
选择将始终返回可枚举的项目。看起来SetElementValue只会对该参数的值执行ToString()。如果您想要单个元素的值,请在.Select()之后使用.First()。Value。如果你想要所有这些,你可能需要添加更多代码来生成多个元素并将它们添加到值中。
答案 2 :(得分:0)
不太确定您的数据是什么,但是您是否尝试在linq之后添加ToList()
或ToArray()
?这将使可枚举成为。