【问题标题】:XML Get element based on attribute基于属性的 XML 获取元素
【发布时间】:2013-11-08 17:26:24
【问题描述】:

谁能帮帮我。我是 XML 和 xElement 的新手。 如何获得年份 = 2013 的男性人数?结果应该是 300。

我有这个 XML:

<company>
  <department>
    <departmentname>Dep 1</departmentname>
    <year id = "2012">
      <men>200</men>
      <women>1000</women>
    </year>
    <year id = "2013">
      <men>300</men>
      <women>400</women>
    </year>
  </department>
</company>

我有这个代码(不工作):

XElement company = XElement.Load(Server.MapPath(myXML.xml));
var men = (from a in company.Elements("department").Elements("year")
           where (string)a.Attribute("id").Value == "2013"
           select (string)(a.Element("men"))).ToList<string>();

【问题讨论】:

  • 其他部门呢!

标签: c# xml xelement


【解决方案1】:

使用 XPath 怎么样?

var xmldoc = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8'?>
    <company>
      <department>
        <departmentname>Dep 1</departmentname>
        <year id = '2012'>
          <men>200</men>
          <women>1000</women>
        </year>
        <year id = '2013'>
          <men>300</men>
          <women>400</women>
        </year>
      </department>
    </company>");

Console.WriteLine(
    xmldoc.XPathSelectElement(
            "/company/department/year[@id='2013']/men").Value);

【讨论】:

    【解决方案2】:

    假设您希望所有部门都使用它

    int mens=company.Descendants("year")
                    .Where(x=>x.Attribute("id").Value=="2013")
                    .Sum(x=>int.Parse(x.Element("men").Value));
    

    您的查询应该是

    int men = (from a in company.Elements("department").Elements("year")
               where a.Attribute("id").Value == "2013"
               select int.Parse(a.Element("men").Value)).Sum();
    

    【讨论】:

    • 我更愿意按照我开始的方式使用 xElement。我该怎么做?
    • @user2939293 在我的电脑上工作...您的 xml 格式不正确..属性值必须在 ""
    • 是的,值在原始文件的“”内。我已经改变了。谢谢
    【解决方案3】:
    XElement company = XElement.Load(Server.MapPath(myXML.xml));
    
    var txt = company.Descendants("men")
        .First(x => int.Parse(x.Parent.Attribute("id").Value) == 2013).Value;
    

    不是很健壮,但会在你的情况下完成这项工作,你应该明白这个想法。

    并且使用 LINQ 语法而不是扩展方法:

    var txt =
        (from c in company.Descendants("men")
         where c.Parent.Attribute("id").Value == "2013"
         select c).First().Value;
    

    【讨论】:

    • 我更愿意按照我开始的方式使用 xElement。我该怎么做?
    • 你开始的方式?你的意思是使用 LINQ 语法而不是扩展方法?
    【解决方案4】:

    好的,伙计们。我用了这个,它正在工作 感谢您的帮助!

     XElement com = (from p in company.Elements("department")
                                        where (string)p.Element("departmentname").Value == "Dep 1"
                                        select p).First();
    
    
    
        var men= (from a in com.Elements("year")
                                  where (string)a.Attribute("id") == "2013"
                                  select (string)(a.Element("men"))).ToList<string>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多