6

私は LINQ to XML の初心者であり、KML の初心者でもあります。我慢してください。

私の目標は、KML ファイルから個々の目印を抽出することです。私の KML は次のように始まります。

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="http://earth.google.com/kml/2.0">
  <name>Concessions</name>
  <visibility>1</visibility>
  <Folder>
    <visibility>1</visibility>
    <Placemark>
      <name>IN920211</name>
      <Style>
        <PolyStyle>
          <color>80000000</color>
        </PolyStyle>
      </Style>
      <Polygon>
        <altitudeMode>relativeToGround</altitudeMode>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>11.728374,1.976421,0 11.732967,1.965322,0 11.737225,1.953161,0 11.635858,1.940812,0 11.658102,1.976874,0 11.728374,1.976421,0 </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
    <Placemark>
    ...

これは私が得た限りです:

    Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml"))
    Dim Placemarks = From Placemark In Kml.Descendants("Placemark") _
         Select Name = Placemark.Element("Name").Value

これまでのところダメです - Kml.Descendants("Placemark") は空の列挙を与えてくれます。KML.Descendants にすべてのノードが含まれているため、ドキュメントは適切に読み込まれます。価値があるのは、これらのクエリも空になることです。

Dim foo = Kml.Descendants("Document") 
Dim foo = Kml.Descendants("Folder") 

誰かが私を正しい方向に向けることができますか? 優れた Linq to XML チュートリアルへのリンクのボーナス ポイント - 私がオンラインで見つけたものは、非常に単純なシナリオで停止します。

4

5 に答える 5

6

これはC#で私にとってはうまくいきます:

XDocument doc = XDocument.Load(@"TheFile.kml");

var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark"); 
于 2009-09-29T17:43:58.080 に答える
1

正しい方向に向けてくれたspoon16とBruce Murdockに感謝します。スプーン16が投稿したコードは機能しますが、名前空間をすべての要素名と連結する必要があり、私が望むほどきれいではありません.

私はもう少し検索を行い、これがどのように行われるべきかを理解しました.これは非常に簡潔であり、XML要素を参照するための新しい <...> ブラケット構文が気に入っています.

Imports <xmlns:g='http://earth.google.com/kml/2.0'>
Imports System.Xml.Linq

 ...

    Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml"))
    For Each Placemark As XElement In Kml.<g:Document>.<g:Folder>.<g:Placemark>
        Dim Name As String = Placemark.<g:name>.Value
    Next

最初の行の xmlns に続く:gに注意してください。これにより、この名前空間を別の場所で参照するためのショートカットが得られます。

XNamespace クラスの詳細については、MSDN のドキュメントを参照してください。

于 2008-09-30T14:26:15.590 に答える
1

Scott Hanselman は、C# ベースのソリューションを探している人のための簡潔なソリューションを提供しています。

VB9 での XLINQ から XML へのサポート

また、文字列を追加するだけでなく、XNamespace を使用すると便利です。これはもう少し形式的です。

// This code should get all Placemarks from a KML file            
var xdoc = XDocument.Parse(kmlContent);
XNamespace ns = XNamespace.Get("http://earth.google.com/kml/2.0");
var ele = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark");
于 2008-10-21T20:39:29.693 に答える
0

XElement 名に名前空間を追加する必要がある場合があります

Dim ns as string = "http://earth.google.com/kml/2.0"
dim foo = Kml.Descendants(ns + "Document") 

構文エラーは無視してください。私は C# で作業しています

あなたは、XElement.Namevsに違いがあるかもしれないことがわかりますXElement.Name.LocalName/

私は通常、正しい命名を使用していることを確認するための最初のステップとして、ドキュメント内のforeachすべてを確認します。XElements

C# 以下は私の使用法の抜粋です。{} を忘れたようです

 private string GpNamespace = 
 "{http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions}";

 var results = admldoc.Descendants(GpNamespace + 
               "presentationTable").Descendants().Select(
                p => new dcPolicyPresentation(p));
于 2008-09-30T02:33:56.363 に答える
0

上記の修正はどちらもうまくいきませんでした。詳細については、私のコメントを参照してください。名前空間が間違いなく問題であるため、spoon16 と Bruce Murdock の両方が正しい方向に進んでいると思います。

さらにグーグルで調べた後、このページで回避策を提案するコードに出くわしました。元の XML から xmlns 属性を削除するだけです。

    ' Read raw XML
    Dim RawXml As String = ReadFile("../kmlimport/ga.kml")
    ' HACK: Linq to XML choking on the namespace, just get rid of it
    RawXml = RawXml.Replace("xmlns=""http://earth.google.com/kml/2.0""", "")
    ' Parse XML
    Dim Kml As XDocument = XDocument.Parse(RawXml)
    ' Loop through placemarks
    Dim Placemarks = From Placemark In Kml.<Document>.<Folder>.Descendants("Placemark")
    For Each Placemark As XElement In Placemarks
        Dim Name As String = Placemark.<name>.Value
        ...
    Next

名前空間を空にする代わりに、名前空間で動作する作業コードを誰かが投稿できる場合は、喜んで答えます。

于 2008-09-30T14:01:36.710 に答える