C# 获取 XML 节点值

Posted

技术标签:

【中文标题】C# 获取 XML 节点值【英文标题】:C# Get XML Node Value 【发布时间】:2013-08-12 19:48:21 【问题描述】:

我想使用 C# 获取 questionanswer 值,但在此之前我想获取我需要的 ID。我正在使用这个 XML:

<root>
  <information>
    <name>Tasks</name>
    <date>15-05-2005</date>
  </information>
  <tasks>
      <task>
        <id>1</id>
        <question>Here comes question 1</question>
        <answer>Answer 1</answer>
      </task>
      <task>
        <id>2</id>
        <question>Here comes question 2</question>
        <answer>Answer 2</answer>
      </task>
      <task>
        <id>3</id>
        <question>Here comes question 3</question>
        <answer>Answer 3</answer>
      </task>
</root>

C#代码:

XDocument tasks;
int TheIdINeed = 2;
string quest = "";
string answ = "";

在表单加载时:

tasks = XDocument.Load(leveltoload);
var status = tasks.Element("level").Element("information");
quest = tasks.Element("root").Element("tasks").Element("task").Element("question").Value; // It returns me the first task data, but I need to load data with required Id (int TheIdINeed = ...)

对不起,我的英语不好。

【问题讨论】:

完美英语 【参考方案1】:

你可以用这个

string id = "2";
var qa = doc.Descendants("tasks").Elements("task")
                       .Where(x => x.Element("id").Value == id).FirstOrDefault();
if (qa != null)

   var question = qa.Element("question").Value;
   var answer = qa.Element("answer").Value;

如果您需要获取此范围之外的问题和答案,我建议创建一个保存数据的类。例如,

public class QuestionAnswer

    public string ID  get; set; 
    public string Question  get; set; 
    public string Answer  get; set; 



var qa = doc.Descendants("tasks").Elements("task")
            .Where(x => x.Element("id").Value == id)
            .Select(x => new QuestionAnswer() 
                    
                      ID = "2",
                      Question = x.Element("question").Value,
                      Answer = x.Element("answer").Value
                    );

您可以通过使用字典来存储问题/答案对来改进上述内容,但这只是为您提供一个想法的示例。如果您的 QuestionAnswer 类比这两个属性更复杂。

【讨论】:

这有点低效,因为您可以使用带有谓词的 FirstOrDefualt 重载。 @It'sNotALie。 - 很好的补充。 +1 为您的答案。【参考方案2】:
var empty = new XElement("e");
var sID = id.ToString();
var element = tasks.Descendants("task")
                   .FirstOrDefault(x => ((string)x.Element("id")) == sID);
string quest = (string)((element ?? empty).Element("question"));
string answ = (string)((element ?? empty).Element("answer"));

【讨论】:

没有XElement.Empty 这样的东西(除非你的意思是IsEmpty,但这不是静态属性)。【参考方案3】:

您可以将所有数据都放入字典中,这样您就不会重复转换为字符串

var res = tasks.Descendants("task")
    .Select(x => x.Elements().ToDictionary(e => e.Name.ToString(), e => (string)e.Value))
    .FirstOrDefault(x => x["id"] == id);

res["question"]
res["answer"]

但如果您的 xml 中有没有问题或答案的任务,您必须先检查 res 是否包含键,然后才能获得价值,或者使用 TryGetValue:

string question;
res.TryGetValue("question", out question);

【讨论】:

以上是关于C# 获取 XML 节点值的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中使用xelement获取xml节点值

在 C# 中使用 XElement 获取 XML 的元素节点值

在 C# 中的 XML 中获取上一级父级的节点值

求C# 获取xml某个节点值方法

C#获取xml值的问题

无法使用 c# 从 xml 读取值/节点