我有一个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>
我使用以下代码来获取crsGain
和cellId
的值。但cellId
我没有得到所需的值...即如果前一个节点我需要cellId
是pdcchCfiMode
。所以我应该得到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
答案 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; }
}
}