获取样式列表

时间:2012-10-21 16:37:44

标签: c# xml linq linq-to-xml

我正在尝试使用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选择中的href内的值,我无法正确获取语法,任何人都可以帮忙吗?

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

4 个答案:

答案 0 :(得分:4)

如果你在谈论像这里的kml文件https://developers.google.com/kml/documentation/KML_Samples.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);
    }
 }

答案 1 :(得分:0)

这样的事情应该有效:

xdoc.Descendants(ns + "Style")
    .Select(s => new
                 {
                     id = s.Attribute("id").Value,
                     href = s.Element("IconStyle")
                             .Element("Icon")
                             .Element("href")
                             .Value
                 });

答案 2 :(得分: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();

答案 3 :(得分:0)

你可以使用linq like

var items = doc.Descendants("field")
           .Where(node => (string)node.Attribute("name") == "Name")
           .Select(node => node.Value.ToString())
           .ToList();