如何在C# UWP中从复杂XML文档获取指定属性值
在C# UWP中从XML文档获取指定属性值的解决方案
我来帮你搞定这个问题,你的代码里有几个小问题导致无法正常运行,咱们一步步来修正:
你的代码存在的问题
- 首先,
skundename的查询结果是IEnumerable<string>(因为你最后select的是属性的Value字符串),但你在foreach里把它当成XElement来处理,类型不匹配,这会直接报错。 - 其次,
foreach内部的代码完全多余——你已经在之前的查询中拿到了目标值,没必要再次重复查询。 - 另外,读取XML的方式可以更高效,没必要先把整个文件读成字符串再解析,
XDocument可以直接加载流。
修正后的完整代码
假设你已经定义了公共字符串变量public string temp { get; set; },下面是可以正常运行的代码:
public async Task GetDataAsync() { StorageFile file = await StorageFile.GetFileFromPathAsync(PathforNeutralFilterDatei); using (IRandomAccessStreamWithContentType stream = await file.OpenReadAsync()) { // 直接从流加载XML,无需先读成字符串 XDocument doc = XDocument.Load(stream.AsStream()); // 查找ID为"S_Kunde_Firma"的Property元素,获取其Value属性值 var targetProperty = doc.Descendants("Property") .FirstOrDefault(p => p.Attribute("ID")?.Value == "S_Kunde_Firma"); // 检查是否找到目标元素,避免空引用异常 if (targetProperty != null) { temp = targetProperty.Attribute("Value")?.Value; } else { // 没找到的话可以设置默认值或者抛出提示 temp = string.Empty; } } }
代码说明
- 使用
using语句管理流资源,确保操作完成后自动释放资源,避免内存泄漏。 - 用
FirstOrDefault代替LINQ查询的集合枚举,因为你只需要获取唯一匹配的那个属性值,这样更简洁高效。 - 使用
?.空条件运算符,避免当属性不存在时抛出空引用异常,让代码更健壮。 - 直接将找到的
Value属性值赋值给公共变量temp,无需多余的循环操作。
另一种更简洁的写法(直接获取值)
如果确定目标元素一定存在,也可以用更短的链式调用:
temp = doc.Descendants("Property") .First(p => p.Attribute("ID").Value == "S_Kunde_Firma") .Attribute("Value").Value;
不过这种写法在元素或属性不存在时会抛出异常,建议还是用带空检查的版本更稳妥。
内容的提问来源于stack exchange,提问作者Faraaz bhilwade
相关产品推荐
相关产品推荐

