如何根据给定xml文件中的上一个节点获取值

时间:2017-09-30 19:02:17

标签: c# xml linq linq-to-xml

我有一个xml文件,如下所示,它是big xml文件的一小部分

<?xml version="1.0" encoding="utf-8" ?>
<xn:VsDataContainer id=test">
  <xn:attributes>
    <xn:vsDataType>vsDataEUtranCellFDD</xn:vsDataType>
    <es:crsGain>0</es:crsGain>
    <es:pciConflictCell>
      <es:enbId>66111</es:enbId>
      <es:cellId>3</es:cellId>
    </es:pciConflictCell>
    <es:pdcchLaGinrMargin>100</es:pdcchLaGinrMargin>
    <es:lbEUtranAcceptOffloadThreshold>50</es:lbEUtranAcceptOffloadThreshold>
    <es:pdcchCfiMode>5</es:pdcchCfiMode>
    <es:cellId>0</es:cellId>
    <es:zzzTemporary21>-2000000000</es:zzzTemporary21>
  </xn:attributes>
</xn:VsDataContainer>

我使用以下代码来获取crsGaincellId的值。但cellId我没有得到所需的值...即如果前一个节点我需要cellIdpdcchCfiMode。所以我应该得到0的值,但我得到3这是序列中的第一个。如何解决这个问题。我正在使用的代码。

if (vsDataEUtranCellFDD.Any()) {
    List<CellName> cells = vsDataEUtranCellFDD.Select(x => new CellName() {
        cellId= (int)x.Descendants().Where(a => a.Name.LocalName == "cellId").FirstOrDefault(),
        crsGain = (int)x.Descendants().Where(a => a.Name.LocalName == "crsGain").FirstOrDefault(),

修改

这个cellid也可以在中间发生,只有区分是前一个节点,即pdcchCfiMode

2 个答案:

答案 0 :(得分:3)

你可以skip the elements while他们不等于pdcchCfiMode然后拿第一个元素。像这样:

cellId = (int)x.Descendants().SkipWhile(a => a.Name.LocalName != "pdcchCfiMode")
        .Skip(1).Take(1).FirstOrDefault(),

答案 1 :(得分:1)

尝试以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> attributes = doc.Descendants().Where(x => x.Name.LocalName == "attributes").ToList();

            XNamespace esNs = attributes.FirstOrDefault().GetNamespaceOfPrefix("es");

            List<CellName> cells = attributes.Select(x => new CellName() {
                cellId = (int)x.Element(esNs + "cellId"),
                crsGain = (int)x.Element(esNs + "crsGain")
            }).ToList();
        }
    }
    public class CellName
    {
        public int cellId { get; set; }
        public int crsGain { get; set; }
    }

}