C# 使用XDocument将XML元素值连接到字符串

C# 使用XDocument将XML元素值连接到字符串,c#,xml,linq,xamarin,xamarin.forms,C#,Xml,Linq,Xamarin,Xamarin.forms,给定一个XML文档-例如: <factory> <widgets> <widget>Foo</widget> <widget>Bar</widget> <widget>Baz</widget> <widget>Qux</widget> </widgets> </factory>

给定一个XML文档-例如:

<factory>
    <widgets>
        <widget>Foo</widget>
        <widget>Bar</widget>
        <widget>Baz</widget>
        <widget>Qux</widget>
    </widgets>
</factory>
我使用的代码是:

var doc = XDocument.Parse(xml) //where XML is a string containing the above XML
var builder = new StringBuilder();
foreach(var widget in doc.Root.Element("widgets").Elements("widget"))
{
    builder.AppendLine(widget.Value);
}
但是,结果字符串是
FooBarBazQux
,而不是换行分隔的版本。在AppendLine调用上设置断点表明,
widget.Value
被设置为“FooBarBazQux”,循环运行一次,而不是我预期的4次

我已尝试在LinqPad中运行查询:

XDocument settings = XDocument.Parse (@"
    <factory>
        <widgets>
            <widget>Foo</widget>
            <widget>Bar</widget>
            <widget>Baz</widget>
            <widget>Qux</widget>
        </widgets>
    </factory>");


foreach(var x in settings.Root.Elements("widgets").Elements("widget"))
    x.Value.Dump("Widget Type");
XDocument settings=XDocument.Parse(@)
福
酒吧
巴兹
库克斯
");
foreach(settings.Root.Elements(“widgets”).Elements(“widget”)中的var x)
x、 Value.Dump(“小部件类型”);
结果是正确的,正如预期的那样

有人能帮我得到一个由
小部件
值组成的换行分隔字符串吗?我有点不知所措


值得注意的是,这是在Xamarin.Forms应用程序中,使用using System.Xml.Linq的PCL版本

我不知道我是否应该把它添加为一个答案,这样它就可以被标记为这样(或者我是否会因为我已经把它放在评论中而被骂)


这是一个愚蠢的错误,因为Android Xamarin项目中启用了“快速部署”

我的XML文件是由应用程序生成的,如果它不存在的话——我假设在重新部署时,所有应用程序资产都将从设备中删除。事实证明,当启用快速部署时,设备只更新应用程序的新组件,即XML文件没有被删除。该问题是由XML文件过期引起的

我认为XML文档最初不正确是由StuartLC指出的潜在问题引起的-我必须有一个名为
builder.AppendLine(doc.Root.Element(“widgets”).Value)
,它返回widget所有子元素的值的串联


谢谢你的帮助

你如何验证这一点?您的代码对我来说运行得很好-请参阅,如果您选择了祖先元素的值/文本,则会同时对所有4个值进行分类,例如,
builder.AppendLine(doc.Root.element(“widgets”).value)
,在您的示例中就是这样做的。注意,xml是区分大小写的,所以
Widgets
Widgets
。还记得在StringBuilder上调用
.ToString()
,以获得最终输出。我刚刚尝试编写了一个最简单可行的示例演示应用程序,该代码确实有效。。。真奇怪。也许我的问题在代码的其他地方。我会调查的。哦,是的-对不起,斯图尔特,我现在已经纠正了这些错误。我已经意识到问题是什么,并把它作为一个答案添加进来-我认为这是两个问题的组合(其中一个是斯图尔特提到的)。
XDocument settings = XDocument.Parse (@"
    <factory>
        <widgets>
            <widget>Foo</widget>
            <widget>Bar</widget>
            <widget>Baz</widget>
            <widget>Qux</widget>
        </widgets>
    </factory>");


foreach(var x in settings.Root.Elements("widgets").Elements("widget"))
    x.Value.Dump("Widget Type");