我正在解析一个包含<es:qrxlev>节点的XML文件。有时这些节点直接在<xn:attributes>节点中找到,有时它们被发现得更深,比如在<es:pciConflictCell>和<es:pciDictictCell>节点中。
我直接在<es:qrxlev>节点中跟踪<xn:attributes>节点的值。
我的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:qrxlev>3</es:qrxlev>
</es:pciConflictCell>
<es:pciConflictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>7</es:qrxlev>
</es:pciConflictCell>
<es:pciDictictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>8</es:qrxlev>
</es:pciDictictCell>
<es:pdcchLaGinrMargin>100</es:pdcchLaGinrMargin>
<es:lbEUtranAcceptOffloadThreshold>50</es:lbEUtranAcceptOffloadThreshold>
<es:pdcchCfiMode>5</es:pdcchCfiMode>
<es:qrxlev>10</es:qrxlev>
<es:zzzTemporary21>-2000000000</es:zzzTemporary21>
</xn:attributes>
</xn:VsDataContainer>我现在使用的代码是:
List<XElement> vsDataEUtranCellFDD = vsDataContainers.Where(x => x.Descendants().Where(a => (a.Name.LocalName == "vsDataType") && ((string)a == "vsDataEUtranCellFDD")).Any()).ToList();
List<CellName> cells = vsDataEUtranCellFDD.Select(x => new CellName()
{
if (vsDataEUtranCellFDD.Any())
{
List<CellName> cells = vsDataEUtranCellFDD
.Select(x => new CellName()
{
qrxlev= (int)x.Descendants()
.Where(a => a.Name.LocalName == "qrxlev")
.FirstOrDefault()
};
}此代码的问题在于它返回所有<es:qrxlev>节点值,而不仅仅是属性节点中的值。如何才能只得到我想要的特定值,而不是所有的值?
发布于 2017-10-02 15:47:30
不要使用Descendants(),因为它获取树中的所有节点。使用Elements(),它获取当前节点的直接子节点。
var xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<xn:VsDataContainer id=""test"" xmlns:xn=""xn"" xmlns:es=""es"">
<xn:attributes>
<xn:vsDataType>vsDataEUtranCellFDD</xn:vsDataType>
<es:crsGain>0</es:crsGain>
<es:pciConflictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>3</es:qrxlev>
</es:pciConflictCell>
<es:pciConflictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>7</es:qrxlev>
</es:pciConflictCell>
<es:pciDictictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>8</es:qrxlev>
</es:pciDictictCell>
<es:pdcchLaGinrMargin>100</es:pdcchLaGinrMargin>
<es:lbEUtranAcceptOffloadThreshold>50</es:lbEUtranAcceptOffloadThreshold>
<es:pdcchCfiMode>5</es:pdcchCfiMode>
<es:qrxlev>10</es:qrxlev>
<es:zzzTemporary21>-2000000000</es:zzzTemporary21>
</xn:attributes>
</xn:VsDataContainer>";
XNamespace xnNamespace = "xn";
XNamespace esNamespace = "es";
var xmlElement = XElement.Parse(xml);
var qrxlev = xmlElement
.Element(xnNamespace + "attributes")
.Element(esNamespace + "qrxlev")
.Value;这将返回10,第四个<es:qrxlev>元素的值。
我必须对您的xml做一些修改:
test属性引用不当发布于 2017-10-02 16:02:26
如果希望获得最高级别的定义,请创建一个方法来查找树中的节点级别,如下所示:
static int GetDocLevel(XElement e) {
var res = 0;
while (e != null) {
res++;
e = e.Parent;
}
return res;
}现在您可以按级别进行排序,并取前一位:
XNamespace esNs = "http://www.es.org"; // <<== The actual namespace goes here
var topQrxlev = doc.Descendants(esNs + "qrxlev").OrderBy(GetDocLevel).FirstOrDefault();下面是一个正在运行的示例:
class Program {
static int GetDocLevel(XElement e) {
var res = 0;
while (e != null) {
res++;
e = e.Parent;
}
return res;
}
static void Main(string[] args) {
var xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<xn:VsDataContainer
xmlns:es=""http://www.es.org""
xmlns:xn=""http://www.xn.org""
>
<xn:attributes>
<xn:vsDataType>vsDataEUtranCellFDD</xn:vsDataType>
<es:crsGain>0</es:crsGain>
<es:pciConflictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>3</es:qrxlev>
</es:pciConflictCell>
<es:pciConflictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>7</es:qrxlev>
</es:pciConflictCell>
<es:pciDictictCell>
<es:enbId>66111</es:enbId>
<es:qrxlev>8</es:qrxlev>
</es:pciDictictCell>
<es:pdcchLaGinrMargin>100</es:pdcchLaGinrMargin>
<es:lbEUtranAcceptOffloadThreshold>50</es:lbEUtranAcceptOffloadThreshold>
<es:pdcchCfiMode>5</es:pdcchCfiMode>
<es:qrxlev>10</es:qrxlev>
<es:zzzTemporary21>-2000000000</es:zzzTemporary21>
</xn:attributes>
</xn:VsDataContainer>";
var doc = XDocument.Parse(xml);
XNamespace esNs = "http://www.es.org";
var topQrxlev = doc.Descendants(esNs + "qrxlev").OrderBy(GetDocLevel).FirstOrDefault();
Console.WriteLine(topQrxlev?.Value); // Prints 10
}
}https://stackoverflow.com/questions/46528601
复制相似问题