XML - 其中节点具有相同的名称但值不同

时间:2016-02-22 11:13:41

标签: c# xml linq

我正在尝试读取一个xml文件(后来将数据导入到sql数据库中),其中包含员工姓名地址'等。 我遇到的问题是,在xml中,员工地址的信息都是相同的。

<Employee>
 <EmployeeDetails>
   <Name>
     <Ttl>Mr</Ttl>
     <Fore>Baxter</Fore>
     <Fore>Loki</Fore>
     <Sur>Kelly</Sur>  
   </Name>
   <Address> 
     <Line>Woof Road</Line>
     <Line>Woof Lane</Line>
     <Line>Woofington</Line>
     <Line>London</Line> 
   </Address>   
    <BirthDate>1985-09-08</BirthDate>   
    <Gender>M</Gender>
    <PassportNumber>123756rt</PassportNumber>   
    </EmployeeDetails>
</Employee>

我所有其他项目都可以提取,我试图使用Linq遍历每个“Line”节点,但它总是只是第一行而不是其他。

 var xAddreesLines = xEmployeeDetails.Descendants("Address").Select(x => new
   {
     address = (string)x.Element("Line").Value

   });
     foreach (var item in xAddreesLines)
       {
          Console.WriteLine(item.address);
       }

我需要能够在导入到我的sql db时,地址行是单独的变量
例如

var addressline1 =第一个<line>节点

var addressline2 =第二个<line>节点等等。

欢迎任何建议。

2 个答案:

答案 0 :(得分:2)

这应该给你预期的输出: -

var xAddreesLines = xdoc.Descendants("Address")
                        .Elements("Line")
                        .Select(x => new { address = (string)x });

您需要简单地获取Line节点中存在的Address元素,然后您可以投影它们。另请注意,使用explicit conversion时无需在节点上调用Value属性。

答案 1 :(得分:1)

你可以这样做:

using System.Xml;
            .
            .
            .
            XmlDocument doc = new XmlDocument();
            doc.Load("source.xml");
            // if you have the xml in a string use doc.LoadXml(stringvar)
            XmlNamespaceManager nsmngr = new XmlNamespaceManager(doc.NameTable);
            XmlNodeList results = doc.DocumentElement.SelectNodes("child::Employee", nsmngr);
            foreach (XmlNode result in results)
            {
                XmlNode namenode = result.SelectSingleNode("Address");
                XmlNodeList types = result.SelectNodes("line");
                foreach (XmlNode type in types)
                {
                    Console.WriteLine(type.InnerText);
                }
                XmlNode fmtaddress = result.SelectSingleNode("formatted_address");
            }

有关原始来源,请参阅此question