Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到XML,使用XNameSpace解析_C#_Xml_Linq_Xnamespace - Fatal编程技术网

C# Linq到XML,使用XNameSpace解析

C# Linq到XML,使用XNameSpace解析,c#,xml,linq,xnamespace,C#,Xml,Linq,Xnamespace,我正在从这个天气链接“”解析这个XML。我发现了一个很好的示例代码,它非常适合解析“tile”和“cap:event”,除了我需要解析“cap:geocode”并在下面获得('value'&'valueName')元素列表之外 <entry> ... <cap:geocode> <valueName>FIPS6</valueName> <value>002016</value> <valueName&g

我正在从这个天气链接“”解析这个XML。我发现了一个很好的示例代码,它非常适合解析“tile”和“cap:event”,除了我需要解析“cap:geocode”并在下面获得('value'&'valueName')元素列表之外

<entry>
    ...
    <cap:geocode>
<valueName>FIPS6</valueName>
<value>002016</value>
<valueName>UGC</valueName>
<value>AKZ185</value>
</cap:geocode>
    ...
</entry>
当我运行代码时,el.Geocode元素包含null。我不知道为什么它没有给我价值观

以下是weather.gov上的XML:

        <?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?>

    <!--
    This atom/xml feed is an index to active advisories, watches and warnings 
    issued by the National Weather Service.  This index file is not the complete 
    Common Alerting Protocol (CAP) alert message.  To obtain the complete CAP 
    alert, please follow the links for each entry in this index.  Also note the 
    CAP message uses a style sheet to convey the information in a human readable 
    format.  Please view the source of the CAP message to see the complete data 
    set.  Not all information in the CAP message is contained in this index of 
    active alerts.
    -->


    <feed
    xmlns = 'http://www.w3.org/2005/Atom'
    xmlns:cap = 'urn:oasis:names:tc:emergency:cap:1.1'
    xmlns:ha = 'http://www.alerting.net/namespace/index_1.0'
    >
    <!-- http-date = Thu, 13 Feb 2014 07:35:00 GMT -->

    <id>http://alerts.weather.gov/cap/us.atom</id>
    <logo>http://alerts.weather.gov/images/xml_logo.gif</logo>
    <generator>NWS CAP Server</generator>
    <updated>2014-02-13T14:35:00-05:00</updated>
    <author>
    <name>w-nws.webmaster@noaa.gov</name>
    </author>
    <title>Current Watches, Warnings and Advisories for the United States Issued by the National Weather Service</title>
    <link href='http://alerts.weather.gov/cap/us.atom'/>

        <entry>
        <id>http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.1251424FD8A0AK.AFCWSWALU.51c52d9702226c0667b44fead05cc33e</id>
        <updated>2014-02-13T09:43:00-09:00</updated>
        <published>2014-02-13T09:43:00-09:00</published>
        <author>
        <name>w-nws.webmaster@noaa.gov</name>
        </author>
        <title>Blizzard Warning issued February 13 at 9:43AM AKST until February 14 at 9:00AM AKST by NWS</title>
        <link href='http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.1251424FD8A0AK.AFCWSWALU.51c52d9702226c0667b44fead05cc33e'/>
        <summary>...ARCTIC AIR RETURNING TO SOUTHWEST ALASKA... .VERY COLD AIR ACCOMPANIED BY BRISK NORTHERLY WINDS WILL MAKE FOR DANGEROUS WIND CHILLS ACROSS MUCH OF SOUTHWEST ALASKA THROUGH FRIDAY. THESE WIND CHILL VALUES WILL BE SOME OF THE COLDEST OF THE ENTIRE WINTER THUS FAR. STRENGTHENING WINDS WILL CONTINUE TO SURGE SOUTHWARD ALONG THE ALASKA PENINSULA AND EASTERN ALEUTIANS.</summary>
        <cap:event>Blizzard Warning</cap:event>
        <cap:effective>2014-02-13T09:43:00-09:00</cap:effective>
        <cap:expires>2014-02-14T09:00:00-09:00</cap:expires>
        <cap:status>Actual</cap:status>
        <cap:msgType>Alert</cap:msgType>
        <cap:category>Met</cap:category>
        <cap:urgency>Expected</cap:urgency>
        <cap:severity>Severe</cap:severity>
        <cap:certainty>Likely</cap:certainty>
        <cap:areaDesc>Eastern Aleutians</cap:areaDesc>
        <cap:polygon></cap:polygon>
        <cap:geocode>
        <valueName>FIPS6</valueName>
        <value>002016</value>
        <valueName>UGC</valueName>
        <value>AKZ185</value>
        </cap:geocode>
        <cap:parameter>
        <valueName>VTEC</valueName>
        <value>/X.UPG.PAFC.WW.Y.0009.140213T2300Z-140214T1800Z/
    /X.EXB.PAFC.BZ.W.0007.140213T1843Z-140214T1800Z/</value>
        </cap:parameter>
        </entry>

        <entry>
        <id>http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.125142504DD0AK.AFCWSWALU.b6bd8b4269647f8f24176412e2248b93</id>
        <updated>2014-02-13T09:43:00-09:00</updated>
        <published>2014-02-13T09:43:00-09:00</published>
        <author>
        <name>w-nws.webmaster@noaa.gov</name>
        </author>
        <title>Blizzard Warning issued February 13 at 9:43AM AKST until February 14 at 12:00PM AKST by NWS</title>
        <link href='http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.125142504DD0AK.AFCWSWALU.b6bd8b4269647f8f24176412e2248b93'/>
        <summary>...ARCTIC AIR RETURNING TO SOUTHWEST ALASKA... .VERY COLD AIR ACCOMPANIED BY BRISK NORTHERLY WINDS WILL MAKE FOR DANGEROUS WIND CHILLS ACROSS MUCH OF SOUTHWEST ALASKA THROUGH FRIDAY. THESE WIND CHILL VALUES WILL BE SOME OF THE COLDEST OF THE ENTIRE WINTER THUS FAR. STRENGTHENING WINDS WILL CONTINUE TO SURGE SOUTHWARD ALONG THE ALASKA PENINSULA AND EASTERN ALEUTIANS.</summary>
        <cap:event>Blizzard Warning</cap:event>
        <cap:effective>2014-02-13T09:43:00-09:00</cap:effective>
        <cap:expires>2014-02-14T12:00:00-09:00</cap:expires>
        <cap:status>Actual</cap:status>
        <cap:msgType>Alert</cap:msgType>
        <cap:category>Met</cap:category>
        <cap:urgency>Expected</cap:urgency>
        <cap:severity>Severe</cap:severity>
        <cap:certainty>Likely</cap:certainty>
        <cap:areaDesc>Alaska Peninsula</cap:areaDesc>
        <cap:polygon></cap:polygon>
        <cap:geocode>
        <valueName>FIPS6</valueName>
        <value>002013 002164</value>
        <valueName>UGC</valueName>
        <value>AKZ181</value>
        </cap:geocode>
        <cap:parameter>
        <valueName>VTEC</valueName>
        <value>/X.EXT.PAFC.BZ.W.0007.140213T1843Z-140214T2100Z/</value>
        </cap:parameter>
        </entry>
</entry>

</feed>

http://alerts.weather.gov/cap/us.atom
http://alerts.weather.gov/images/xml_logo.gif
NWS CAP服务器
2014-02-13T14:35:00-05:00
w-nws。webmaster@noaa.gov
国家气象局为美国发布的最新观测、警告和咨询
http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.1251424FD8A0AK.AFCWSWALU.51c52d9702226c0667b44fead05cc33e
2014-02-13T09:43:00-09:00
2014-02-13T09:43:00-09:00
w-nws。webmaster@noaa.gov
NWS于2月13日上午9:43发布暴风雪警报,至2月14日上午9:00发布
…北极空气返回阿拉斯加西南部。非常冷的空气伴随着强劲的北风,将在星期五在阿拉斯加西南部造成危险的风寒。这些风寒值将是迄今为止整个冬季最冷的数值之一。加强的风将继续沿着阿拉斯加半岛和东阿留申群岛向南汹涌。
暴雪警告
2014-02-13T09:43:00-09:00
2014-02-14T09:00:00-09:00
实际的
警觉的
遇见
预期
严峻的
可能
东阿留申群岛
图6
002016
教资会
AKZ185
VTEC
/X.UPG.PAFC.WW.Y.0009.140213T2300Z-140214T1800Z/
/X.EXB.PAFC.BZ.W.0007.140213T1843Z-140214T1800Z/
http://alerts.weather.gov/cap/wwacapget.php?x=AK12514240A72C.BlizzardWarning.125142504DD0AK.AFCWSWALU.b6bd8b4269647f8f24176412e2248b93
2014-02-13T09:43:00-09:00
2014-02-13T09:43:00-09:00
w-nws。webmaster@noaa.gov
NWS于2月13日上午9:43发布暴风雪警报,至2月14日下午12:00发布
…北极空气返回阿拉斯加西南部。非常冷的空气伴随着强劲的北风,将在星期五在阿拉斯加西南部造成危险的风寒。这些风寒值将是迄今为止整个冬季最冷的数值之一。加强的风将继续沿着阿拉斯加半岛和东阿留申群岛向南汹涌。
暴雪警告
2014-02-13T09:43:00-09:00
2014-02-14T12:00:00-09:00
实际的
警觉的
遇见
预期
严峻的
可能
阿拉斯加半岛
图6
002013 002164
教资会
AKZ181
VTEC
/X.EXT.PAFC.BZ.W.0007.140213T1843Z-140214T2100Z/

我认为您的第一个问题是在这部分代码中缺少名称空间

val = gc.Element("value"),
valName = gc.Element("valueName")
我认为您的第二个问题是,您已经将匿名类型的GeoCode属性编写为
元素的列表,而您希望将其用作
元素中的valueName/value对的列表。至少这是我的假设。因此,这可能更接近您想要的

var xlist = doc.Descendants(ns + "entry").Select(elem => new
{
    Title = elem.Descendants(ns + "title").FirstOrDefault(),
    AreaDesc = elem.Descendants(nsCap + "areaDesc").FirstOrDefault(),
    GeocodeElements = elem.Descendants(nsCap + "geocode").Descendants()
});

foreach (var el in xlist)
{
    System.Diagnostics.Debug.WriteLine(string.Format("title: {0}, AreaDesc: {1}",
        el.Title != null ? el.Title.Value : string.Empty,
        el.AreaDesc != null ? el.AreaDesc.Value : string.Empty));
    var geoCodeValues = el.GeocodeElements
                .Where(o => o.Name == ns + "value").ToList();
    var geoCodeValueNames = el.GeocodeElements
                .Where(o => o.Name == ns + "valueName").ToList();
    var pairs = geoCodeValueNames.Zip(geoCodeValues, (vn, v) =>
                        new Tuple<String, String>(vn.Value, v.Value)).ToList();
}
var xlist=doc.subjects(ns+“条目”)。选择(elem=>new
{
Title=元素后代(ns+“Title”).FirstOrDefault(),
AreaDesc=元素后代(nsCap+“AreaDesc”).FirstOrDefault(),
GeocodeElements=elem.substands(nsCap+“geocode”).substands()
});
foreach(xlist中的变量el)
{
System.Diagnostics.Debug.WriteLine(string.Format(“title:{0},AreaDesc:{1}”),
el.Title!=null?el.Title.Value:string.Empty,
el.AreaDesc!=null?el.AreaDesc.Value:string.Empty));
var geoCodeValues=el.GeocodeElements
其中(o=>o.Name==ns+“值”).ToList();
var geoCodeValueNames=el.GeocodeElements
其中(o=>o.Name==ns+“valueName”).ToList();
var pairs=geoCodeValueNames.Zip(geoCodeValues,(vn,v)=>
新元组(vn.Value,v.Value)).ToList();
}
请注意,在最后一行中,我使用了元组而不是匿名类型,因为它不允许我创建一个匿名类型,该类型有两个名为“Value”的属性。我希望这只是一个开始(我不确定我的代码有多健壮——比如如果不是每个值都与一个valueName配对会怎么样?等等),可能还有其他方法来解决这个问题。我只是想让你更接近我想你要做的事

var xlist = doc.Descendants(ns + "entry").Select(elem => new
{
    Title = elem.Descendants(ns + "title").FirstOrDefault(),
    AreaDesc = elem.Descendants(nsCap + "areaDesc").FirstOrDefault(),
    GeocodeElements = elem.Descendants(nsCap + "geocode").Descendants()
});

foreach (var el in xlist)
{
    System.Diagnostics.Debug.WriteLine(string.Format("title: {0}, AreaDesc: {1}",
        el.Title != null ? el.Title.Value : string.Empty,
        el.AreaDesc != null ? el.AreaDesc.Value : string.Empty));
    var geoCodeValues = el.GeocodeElements
                .Where(o => o.Name == ns + "value").ToList();
    var geoCodeValueNames = el.GeocodeElements
                .Where(o => o.Name == ns + "valueName").ToList();
    var pairs = geoCodeValueNames.Zip(geoCodeValues, (vn, v) =>
                        new Tuple<String, String>(vn.Value, v.Value)).ToList();
}