【发布时间】:2012-08-28 12:52:05
【问题描述】:
我正在使用 Linq to XML 解析 XML 文本。返回的 XDocument 将所有这些命名空间添加到我的每个节点,并且无法找到后代,或者至少,我对“地标”的搜索不起作用,很可能是因为 kml:Placemark 不适合搜索。
当我在单元测试中使用基本的 XML 文件对此进行测试时,它运行良好。我猜 XML 声明部分没有所有的命名空间。
如何在不添加所有命名空间的情况下解析 XML 文本?
解析:
XDocument document = XDocument.Parse(text);
var polygonNodes = document.Descendants("Polygon"); // yields no nodes, even though there are descendants with this.
原始文件
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>poly1_philmont.kml</name>
<Style id="s_ylw-pushpin_hl">
<IconStyle>
<scale>1.3</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
</IconStyle>
<LineStyle>
<color>ff0000aa</color>
</LineStyle>
<PolyStyle>
<color>33ffaa00</color>
</PolyStyle>
</Style>
... </kml>
用 XDocument(根节点)解析
<kml:kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<kml:Document>
<kml:name>poly1_philmont.kml</kml:name>
<kml:Style id="s_ylw-pushpin_hl">
<kml:IconStyle>
<kml:scale>1.3</kml:scale>
<kml:Icon>
<kml:href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</kml:href>
</kml:Icon>
<kml:hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
</kml:IconStyle>
<kml:LineStyle>
<kml:color>ff0000aa</kml:color>
</kml:LineStyle>
<kml:PolyStyle>
<kml:color>33ffaa00</kml:color>
</kml:PolyStyle>
</kml:Style>
...
</kml:kml>
【问题讨论】:
-
你看,这是设计使然。因此,您需要将命名空间与元素名称连接起来才能成功执行搜索。
-
我不明白为什么当GE创建KML时,它指定了命名空间,但命名空间是自动解释的,而不是明确地放在每个节点中。我猜 XDocument 需要在读取时明确命名它,但不知何故能够自行确定它?
-
不是[xmlns="opengis.net/kml/2.2]表示默认命名空间吗?
标签: c# .net-3.5 linq-to-xml kml