使用LINQ从复杂的XML中提取数据 [英] Extracting data from a complex XML with LINQ

查看:64
本文介绍了使用LINQ从复杂的XML中提取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是将ValueReference节点,TimeInstant属性和timePosition节点中包含的数据保存到变量中.我能够获取valueReference节点的值(未注释的部分有效),但无法获取其他两个值. 任何帮助将不胜感激.

My goal is to save the data contained in the ValueReference node, TimeInstant attribute, and timePosition node into variables. I am able to get the value of the valueReference node (the un-commented section works), but not the other two. Any help would be greatly appreciated.

这是我正在处理的代码:

Here is the code that I am working on:

public void LinqToXml()
{
    XNamespace sosNamespace = XNamespace.Get("http://www.opengis.net/sos/2.0");
    XNamespace fesNamespace = XNamespace.Get("http://www.opengis.net/fes/2.0");
    XNamespace gmlNamespace = XNamespace.Get("http://www.opengis.net/gml/2.0");
    var root = XElement.Load(@"C:\Working Directory\OGCSOS.Service\OGCSOS.Service\Resources\GetObservation_TemporalFilter.xml");
    var a = (from level in root.Descendants(sosNamespace + "temporalFilter")
             select new
             {
                 valueReference = (string)level.Descendants(fesNamespace + "After")
                                               .Elements(fesNamespace + "ValueReference")
                                               .First(),
                 /*timeInstant = (string)level.Descendants(fesNamespace + "After")
                                               .Elements(gmlNamespace + "TimeInstant")
                                               .Attributes(gmlNamespace + "id")
                                               .First()*/
                 /*timePosition = (string)level.Descendants(fesNamespace + "After")
                                             .Elements(gmlNamespace + "TimeInstant")
                                             .First()*/
             }).ToList();

这是我要阅读的XML:

And here is the XML I am trying to read:

    <?xml version="1.0" encoding="UTF-8"?>
<sos:GetObservation xmlns="http://www.opengis.net/sos/2.0" service="SOS" version="2.0.0" 
                    xmlns:sos="http://www.opengis.net/sos/2.0" xmlns:fes="http://www.opengis.net/fes/2.0" 
                    xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:swe="http://www.opengis.net/swe/2.0" 
                    xmlns:swes="http://www.opengis.net/swes/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sos/2.0
http://schemas.opengis.net/sos/2.0/sos.xsd">

    <!--identifier of an offering-->
    <offering>HG.Logger@DJK001</offering>

    <!--identifier of an observed property-->
    <observedProperty>HG</observedProperty>

    <!--optional temporal filter restricting the results which shall be returned-->
    <temporalFilter>
        <fes:After>
            <fes:ValueReference>phenomenonTime</fes:ValueReference>
            <gml:TimeInstant gml:id="startPosition">
                <gml:timePosition>2008-03-01T17:44:15.000+00:00</gml:timePosition>
            </gml:TimeInstant>
        </fes:After>
    </temporalFilter>

    <featureOfInterest>DJK001</featureOfInterest>

</sos:GetObservation>

推荐答案

将您的gml命名空间更改为

Your gml namespace is not correct, after changing it to

 XNamespace gmlNamespace = XNamespace.Get("http://www.opengis.net/gml/3.2");

您可以使用

timeInstant = level.Descendants(fesNamespace + "After")
                   .First()
                   .Element(gmlNamespace + "TimeInstant")
                   .Attribute(gmlNamespace + "id")
                   .Value,

timePosition = level.Descendants(fesNamespace + "After")
                    .First()
                    .Element(gmlNamespace + "TimeInstant")
                    .Value

这篇关于使用LINQ从复杂的XML中提取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆