4

確かに、私はすでに同様の質問をしましたが、これは異なり、試してみました。

Linq を使用して XML データを読み取ろうとして、この問題を解決しましたが、複数の値を選択して辞書に保存する必要があります。私は試しました(コメントは私の試みです)が、それを理解できず、次のようなエラーが発生します。

System.NullReferenceException: オブジェクト参照が dsdsdsds.MainClass+c__AnonStorey0.<>m__0 (System.Xml.Linq.XElement datanum) [0x00000] のオブジェクトのインスタンスに設定されていません /Users/p/Projects/dsdsdsds/dsdsdsds/Main .cs:23

XML ファイルが次のようになっているとします。

<?xml version="1.0" encoding="UTF-8"?>
   <kml xmlns="http://www.opengis.net/kml/2.2">
     <Document>
       <name>My word place</name>
         <Placemark>
           <name>Main Building</name> 
             <id>1</id>
               <Polygon>
            <extrude>1</extrude>
         <altitudeMode>relativeToGround</altitudeMode>
       <outerBoundaryIs>
    <LinearRing>
 <coordinates>

ここで取得する必要があるのは、「名前」と「ID」であり、これらの値を辞書に入れます。

これが私のコードです:

var xdoc = XDocument.Load ("buildings.kml");
        XNamespace kml = "http://www.opengis.net/kml/2.2";

        var dict = xdoc.Descendants(kml + "Placemark").ToDictionary (

            datanum => datanum.Attribute(kml + "name").Value,
            datanum => datanum.Attribute(kml + "id").Value );

            /*.ToDictionary(e => e.Element("name").Value,
                                 e => e.Descendants("id")
                                    .Select (item => new Building
                                    {
                                        BuildingName = (string) e.Element(kml + "name").Value,
                                        BuildingID = Convert.ToInt16(item.Element(kml + "id").Value)
                                    }).ToList()
                                    );
        /*

        /*var buildings = xdoc.Descendants (kml + "Placemark")
            .Select((element, index) => new Building {
                BuildingName = (string) element.Element(kml + "name"),
                BuildingID = (int) element.Element(kml + "id")
            });
        */

注: これを 3 回試みましたが、同じまたは類似のエラー メッセージが表示されます。

4

1 に答える 1

5

nameおよびid要素であり、属性ではありません。Element()したがって、次の代わりにを使用する必要がありますAttribute()

var dict = xdoc.Descendants(kml + "Placemark")
               .ToDictionary(datanum => datanum.Element(kml + "name").Value,
                             datanum => datanum.Element(kml + "id").Value);

nameまたはidがオプションのタグである場合は、次のコードを使用して:を回避できますNullReferenceException

var dict = doc.Descendants(kml + "Placemark")
              .Select(x => new { name = (string)x.Element(kml + "name"),
                                 id = (string)x.Element(kml + "id") })
              .Where(x => x.name != null)
              .ToDictionary(x => x.name, x => x.id);

注意:これはPlacemark、タグのないタグを単に無視しますnamePlacemarkタグのみのnameタグとタグのないidタグは引き続き考慮されます。

ところで:あなたのフォーマットはこれをかなりうまく覆い隠します、しかしあなたがあなたの質問で提供したXMLは有効ではありません。正しくフォーマットされると、これは明らかになります。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
  <name>My word place</name>
  <Placemark>
    <name>Main Building</name> 
    <id>1</id>
    <Polygon>
      <extrude>1</extrude>
      <altitudeMode>relativeToGround</altitudeMode>
      <outerBoundaryIs>
        <LinearRing>
          <coordinates>
于 2013-01-24T13:46:58.270 に答える