C#使用System.Xml创建带=符号的XML及KML StyleMap节点问题
问题核心原因
- 你看到的
<StyleMap id="msn_placemark_circle"> =结构里的=是无效冗余字符,不属于合法XML/KML语法的一部分:这是你复制/查看KML文件时,文本显示错位带出来的多余符号,标准Google Earth KML规范里的StyleMap节点根本不存在这个符号。 - XML语法规则里,起始标签闭合的
>之后出现的内容会被识别为节点的文本内容,一旦你强行在这里插入=,解析器会判定StyleMap节点已经进入文本内容阶段,后续的<Pair>会被识别为和StyleMap平级的独立节点,自然不会被判定为子节点。 - 强行保留这个
=生成的XML文件是完全不符合规范的无效文件,Google Earth无法正常加载,没有实际使用价值。
基于System.Xml的正确实现代码
using System.Xml; // 配置XML输出格式,匹配KML的缩进规范 XmlWriterSettings kmlWriteSettings = new XmlWriterSettings() { Indent = true, IndentChars = " ", NewLineHandling = NewLineHandling.Replace }; using (XmlWriter writer = XmlWriter.Create("target.kml", kmlWriteSettings)) { // 写入StyleMap根节点及id属性 writer.WriteStartElement("StyleMap"); writer.WriteAttributeString("id", "msn_placemark_circle"); // 写入第一个normal状态Pair子节点 writer.WriteStartElement("Pair"); writer.WriteElementString("key", "normal"); writer.WriteElementString("styleUrl", "#sn_placemark_circle"); writer.WriteEndElement(); // 写入第二个highlight状态Pair子节点 writer.WriteStartElement("Pair"); writer.WriteElementString("key", "highlight"); writer.WriteElementString("styleUrl", "#sh_placemark_circle_highlight"); writer.WriteEndElement(); // 闭合StyleMap节点 writer.WriteEndElement(); }
上述代码生成的是完全符合KML标准的合法结构,可以直接被Google Earth正常识别加载,StyleMap和Pair的父子层级关系完全正确。
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

