使用XDocument

时间:2015-06-16 09:31:55

标签: c# xml linq xamarin xamarin.forms

给定XML文档 - 例如:

<factory>
    <widgets>
        <widget>Foo</widget>
        <widget>Bar</widget>
        <widget>Baz</widget>
        <widget>Qux</widget>
    </widgets>
</factory>

我希望构建一个换行符分隔的小部件值字符串 - 使用上面的XML,这将是:

Foo
Bar
Baz
Qux

我用来执行此操作的代码是:

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被设置为&#34; FooBarBazQux&#34;,并且循环运行一次而不是我期待的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");

并且结果是正确的并且符合预期。

有人可以帮助我获取换行符分隔的Widget字符串吗?我有点失落!

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

2 个答案:

答案 0 :(得分:0)

我不知道是否应该将其添加为答案,以便可以将其标记为(或者我会因为我已经将其置于评论中而大喊大叫)

builder.ToString()

答案 1 :(得分:0)

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

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

我认为最初错误的XML文档是由StuartLC指出的潜在问题引起的 - 我必须在某一点上调用builder.AppendLine(doc.Root.Element("widgets").Value),它返回窗口小部件的所有子元素值的串联。

感谢您的帮助!