0

xdocとLINQを使用して、次のxmlファイルでスタイルのリストを取得しようとしています。

<?xml version="1.0" encoding="UTF-8"?>
<kml>
  <Document>
    <Style id="style62">
      <IconStyle>
        <Icon>
          <href>http://maps.gstatic.com/mapfiles/ms2/micons/yellow-dot.png</href>
        </Icon>
      </IconStyle>
    </Style>
  </Document>
</kml>

ID = "style62"と、同じLINQ selectのhref内の値を取得するために構文を正しく取得できません。誰か助けてもらえますか?

var styles = xdoc.Descendants(ns + "Style")
                .Select(s => new
                {
                    //HELP!?!
                    //E.G
                    //
                    //id = s.something  (style62)
                    //href = s.something (url)
                }).ToList();
4

4 に答える 4

4

https://developers.google.com/kml/documentation/KML_Samples.kmlのようなkmlファイルについて話している場合は 、以下のコードが機能するはずです。ここでの問題は、すべての「スタイル」に「href」タグが含まれていないことです。

var xDoc = XDocument.Parse(xml);
XNamespace ns = "http://www.opengis.net/kml/2.2";
var items = xDoc.Descendants(ns + "Style")
                .Select(d => 
                {
                   var h = d.Descendants(ns + "href").FirstOrDefault();
                   return new
                   {
                       Id = d.Attribute("id").Value,
                       Href = h == null ? null : h.Value
                   };
                })
                .ToList();

単純な拡張方法で、クエリを単純化できます

XNamespace ns = "http://www.opengis.net/kml/2.2";
var items = xDoc.Descendants(ns + "Style")
                .Select(d => new
                {
                   Id = d.Attribute("id").Value,
                   HRef = d.Descendants(ns + "href").FirstOrDefault()
                                                    .IfNotNull(h=>h.Value)
                })
                .ToList();



public static class S_O_Extensions
{
    public static S IfNotNull<T, S>(this T obj,Func<T,S> selector)
    {
        if (obj == null) return default(S);
        return selector(obj);
    }
 }
于 2012-10-21T16:43:59.100 に答える
0

このようなものが機能するはずです:

xdoc.Descendants(ns + "Style")
    .Select(s => new
                 {
                     id = s.Attribute("id").Value,
                     href = s.Element("IconStyle")
                             .Element("Icon")
                             .Element("href")
                             .Value
                 });
于 2012-10-21T16:41:47.917 に答える
0

これをLinqPadで実行します。

XDocument doc = XDocument.Parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<kml>" +
  "<Document>" +
    "<Style id=\"style62\">" +
      "<IconStyle>" +
        "<Icon>" +
          "<href>http://maps.gstatic.com/mapfiles/ms2/micons/yellow-dot.png</href>" +
        "</Icon>" +
      "</IconStyle>" +
    "</Style>" +
  "</Document>" +
"</kml>");

var styles = from document in doc.Root.Elements("Document")
            from style in document.Elements("Style")
            where style.Attribute("id").Value == "style62"
            select new 
            {
                StyleElement = style,
                Href = style.Element("IconStyle").Element("Icon").Element("href").Value
            };


styles.Dump();
于 2012-10-21T16:45:07.370 に答える
0

linqを次のように使用できます

var items = doc.Descendants("field")
           .Where(node => (string)node.Attribute("name") == "Name")
           .Select(node => node.Value.ToString())
           .ToList();
于 2012-10-21T16:49:20.833 に答える