【问题标题】:C# reading values of elements from an XML treeC# 从 XML 树中读取元素的值
【发布时间】:2014-01-08 21:50:16
【问题描述】:

我正在尝试读取 XML 文档中特定元素的一些值,例如

的值。

<?xml version="1.0" ?>
<main>
  <alpha>One</alpha>
  <beta>
    <delta>DeltaValueFromBeta</delta>
    <epsilon>EpsilonValueFromBeta</epsilon>
    <phi>PhiValueFromBeta</phi>
  </beta>
  <gamma>
    <delta>DeltaValueFromGamma</delta>
    <epsilon>EpsilonValueFromGamma</epsilon>
    <phi>PhiValueFromGamma</phi>
  </gamma>
</main>

我可以使用如下代码获取值:

XDocument doc = XDocument.Load("Sample.xml");
var quiz = from elements in doc.Elements("main").Elements("beta").Elements("epsilon")
           select elements;

foreach (var item in quiz)
{
  string sValue = (string) item.Value;
  textBox1.AppendText(sValue);
}           

有没有更直接的方法来选择我需要的元素值,而不必使用 foreach 循环?

谢谢 尼克

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    XPath 是直接访问节点的另一个选项。该参考资料可能对您有所帮助。 How to get values from an XML file matching XPath query in C#

    编辑以添加到不带 foreach 的文本框 where result = XPath 查询结果集合:

    textbox1.AppendText(result.Select(x => x.Value));
    

    XPath 比 LINQ 查询更容易构建动态路径。

    【讨论】:

    • +1 当我看到你的答案弹出时,我正在写这个 ^^。这是一个link,以 XPath 请求开头。它并不详尽,也不包含完整的参考资料,但它是一个很好的起点。
    • 他要求优化 for 循环,而不是 from 语句。使用 XPath,他仍然会得到一组需要处理的项目。
    【解决方案2】:

    您可以在 linq 查询中执行此操作:

    var quiz = (from elements in doc.Elements("main").Elements("beta").Elements("epsilon")
           select (string)elements).ToList();
    

    它会给你价值列表。你可以在不使用 foreach 的情况下附加你的文本:

    StringBuilder sb = new StringBuilder();
    var values = quiz.Select(x => sb.Append(x));
    textBox1.AppendText(sb.ToString());
    

    或者更好的方法:

    var text = doc.Descendants("epsilon")
                   .Select(x => (string)x)
                   .Aggregate((x,y) => x + y);
    textBox1.AppendText(text)
    

    【讨论】:

    • 使用 StringBuilder 和 AppendText 它的副本。其中之一是不必要的。
    • 谢谢 Selman22。我最初尝试了你写的代码,我以为我得到了错误的结果(实际上它是正确的,但我累了)。
    【解决方案3】:
    textBox1.AppendText(quiz.Select(x => x.Value).Aggregate((s, s1) => s + s1));
    

    【讨论】:

      【解决方案4】:

      使用以下内容,因此您不必使用 foreach:

      IEnumerable<string> values = quiz.Select(x => x.Value);
      

      或多合一:

      IEnumerable<string> values = doc.Elements("main").Elements("beta").Elements("epsilon").Select(x => x.Value);
      
      textBox1.AppendText(values.Aggregate((i, j) => i + j));
      

      【讨论】:

      • 嗨,山姆,感谢您的回答。我从您的示例代码中得到一个错误“不能隐式 Ienumerable to List”
      • List values = doc.Elements("main").Elements("beta").Elements("epsilon").Select(x => x.Value).ToList()将解决 IEnumerable 错误。注意: .ToList() 调用。或者实例化为 "IEnumerable values =" 而你不需要 .ToList() 调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多