【问题标题】:Get node attribute xml C#获取节点属性xml C#
【发布时间】:2014-12-15 08:06:24
【问题描述】:

我正在尝试从 xml 文件中获取所有节点,但无法获取具有 Home 和 Work 等属性的节点。好吧,就我而言,我可以打电话回家,但不能打电话给工作。谢谢你。

这是xml文件结构:

<Employees>
    <Employee>
      <EmpId>1</EmpId>
      <Name>Sam</Name>   
      <Sex>Male</Sex>
      <Phone Type="Home">423-555-0124</Phone>
      <Phone Type="Work">424-555-0545</Phone>
      <Address>
          <Street>7A Cox Street</Street>
          <City>Acampo</City>
          <State>CA</State>
          <Zip>95220</Zip>
          <Country>USA</Country>
      </Address>
    </Employee>
</Employee>  

这是我的 C# 代码:

XElement xelement = XElement.Load("employees.xml");
IEnumerable<XElement> employees = xelement.Elements();
Console.WriteLine("List of all Employee Names along with their ID:");
foreach (var employee in employees)
{     
   employee.Element("EmpId").Value);
   Console.WriteLine("SEX: {0}", employee.Element("Sex").Value);
   Console.WriteLine("Home: {0}", employee.Element("Phone").Value);
   Console.WriteLine("Work: {0}\n", employee.Element("Phone").Value);
}

结果:

希望:

【问题讨论】:

    标签: c# xml linq foreach xml-parsing


    【解决方案1】:

    您需要使用Attribute 方法来获取属性。您需要使用HomeType 属性查询Phone 元素。例如:

    Console.WriteLine("Home: {0}",
        employee.Elements("Phone")
                .Single(x => x.Attribute("Type").Value == "Home")
                .Value);
    

    如果没有您想要的类型的电话号码,或者如果有多个电话号码,您应该考虑要做什么。 (Single 方法只需要一个匹配项。还有FirstLast,以及FirstOrDefaultLastOrDefault,如果没有匹配项将返回null。)

    【讨论】:

    • 嗨乔恩,你能建议我如何解决未设置为对象实例的对象引用吗?谢谢。
    • @doro:是的 - 找出哪个引用是null,找出原因,然后找出你想做什么。见tinyurl.com/so-nre
    • 感谢您的链接。假设我搜索一个元素,可能有一个属性或没有。如果存在它很好,但如果它不存在呢?我仍然可以使用相同的链接吗?
    • @doro:在这种情况下 - 这对于 LINQ to XML 来说是相当特定的 - 您可以使用转换为 string 而不是采用 Value 属性:x =&gt; (string) x.Attribute("Type") == ...。这是因为如果输入是null,从XAttributestring 的显式转换返回null
    • 我遇到了一些其他问题,你可能是唯一一个解决这个问题的人。谢谢你。 stackoverflow.com/questions/27527748/…
    【解决方案2】:

    这应该让你获得第一个名为 Phone 的元素,其中属性名称是 'Home'

    employee.Elements("Phone")
                      .First(x => x.Attribute("name").Value == "Home");
    

    【讨论】:

    • 感谢您的回答,但结果也包含标签。
    • 我明白了,最后需要 .Value:employee.Elements("Phone").First(x => x.Attribute("Type").Value == "Work").Value
    【解决方案3】:

    这是您的完整代码

    static void Main(string[] args)
    {
       XElement xelement = XElement.Load("Employees.xml");
       IEnumerable<XElement> employees = xelement.Elements();
       Console.WriteLine("List of all Employee Names along with their ID:");
       foreach (var employee in employees)
       {     
          Console.WriteLine("EmpId: {0}", employee.Element("EmpId").Value);
          Console.WriteLine("SEX: {0}", employee.Element("Sex").Value);
         //Console.WriteLine("Home: {0}", employee.Element("Phone").Value);
          Console.WriteLine("Home: {0}", employee.Elements("Phone")
                   .Single(x => x.Attribute("Type").Value == "Home").Value);
          Console.WriteLine("Home: {0}", employee.Elements("Phone")
                   .Single(x => x.Attribute("Type").Value == "Work").Value);
         //Console.WriteLine("Work: {0}\n", employee.Element("Phone").Value);
       }
       Console.Read();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多