首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ从复杂XML中提取数据

使用LINQ从复杂XML中提取数据
EN

Stack Overflow用户
提问于 2012-10-26 00:39:21
回答 4查看 904关注 0票数 0

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

下面是我正在编写的代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    <?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>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-26 00:53:34

您的gml命名空间不正确,请将其更改为

代码语言:javascript
复制
 XNamespace gmlNamespace = XNamespace.Get("http://www.opengis.net/gml/3.2");

您可以使用

代码语言:javascript
复制
timeInstant = level.Descendants(fesNamespace + "After")
                   .First()
                   .Element(gmlNamespace + "TimeInstant")
                   .Attribute(gmlNamespace + "id")
                   .Value,

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

Stack Overflow用户

发布于 2012-10-26 00:49:11

你应该这样做

代码语言:javascript
复制
XNamespace sosNamespace = "http://www.opengis.net/sos/2.0";
XNamespace fesNamespace = "http://www.opengis.net/fes/2.0";
XNamespace gmlNamespace = "http://www.opengis.net/gml/3.2";
//you had used 2.0 instead of 3.2
var root = XElement.Load(@"C:\WorkingDirectory\OGCSOS.Service\OGCSOS.Service\Resources\GetObservation_TemporalFilter.xml");
var yourList=root.Descendants(sosNamespace+"temporalFilter").Descendants(fesNamespace+"After").Select(x=>
new
{
ValueReference=x.Element(fesNamespace+"ValueReference").Value,
timeInstant=x.Element(gmlNamespace+"TimeInstant").Attribute(gmlNamespace+"id").Value,
timePosition=x.Element(gmlNamespace+"TimeInstant").Element(gmlNamespace+"timePosition").Value
}
);

yourList包含所有数据

票数 1
EN

Stack Overflow用户

发布于 2012-10-26 01:41:33

你也可以使用老的XPath

代码语言:javascript
复制
    var doc = new XPathDocument("1.xml");
    var nav = doc.CreateNavigator();
    var mng = new XmlNamespaceManager(nav.NameTable);
    mng.AddNamespace("sos", "http://www.opengis.net/sos/2.0");
    mng.AddNamespace("fes", "http://www.opengis.net/fes/2.0");
    mng.AddNamespace("gml", "http://www.opengis.net/gml/3.2");
    var valueReference = nav.SelectSingleNode("//sos:GetObservation/sos:temporalFilter/fes:After/fes:ValueReference[1]", mng).TypedValue;
    var TimeInstant = nav.SelectSingleNode("//sos:GetObservation/sos:temporalFilter/fes:After/gml:TimeInstant/@gml:id", mng).TypedValue;
    var timePosition = nav.SelectSingleNode("//sos:GetObservation/sos:temporalFilter/fes:After/gml:TimeInstant/gml:timePosition[1]", mng).TypedValue;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13073260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档