C#でXMLデータを操作する際ののメモ
仕様するXMLは、GISで使用するStyledLayerDescriptorを想定しています。
使用したXML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
<?xml version="1.0" encoding="utf-8" standalone="no"?> <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> <NamedLayer> <Name>土石流</Name> <UserStyle> <Title>Polygon Yellow</Title> <Abstract>Polygon Yellow</Abstract> <FeatureTypeStyle> <Rule> <Name>0</Name> <Title>土石流警戒区域</Title> <ogc:Filter> <ogc:Or> <ogc:PropertyIsEqualTo> <ogc:PropertyName>linetype</ogc:PropertyName> <ogc:Literal>6421</ogc:Literal> </ogc:PropertyIsEqualTo> <ogc:PropertyIsEqualTo> <ogc:PropertyName>linetype</ogc:PropertyName> <ogc:Literal>6424</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Or> </ogc:Filter> <PolygonSymbolizer> <Fill> <CssParameter name="fill">#fcfc8c</CssParameter> <CssParameter name="fill-opacity">0.5</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#405585</CssParameter> <CssParameter name="stroke-width">1</CssParameter> </Stroke> </PolygonSymbolizer> </Rule> <Rule> <Name>1</Name> <Title>土石流特別警戒区域</Title> <ogc:Filter> <ogc:Or> <ogc:PropertyIsEqualTo> <ogc:PropertyName>linetype</ogc:PropertyName> <ogc:Literal>6411</ogc:Literal> </ogc:PropertyIsEqualTo> <ogc:PropertyIsEqualTo> <ogc:PropertyName>linetype</ogc:PropertyName> <ogc:Literal>6414</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Or> </ogc:Filter> <PolygonSymbolizer> <Fill> <CssParameter name="fill">#fc8c5e</CssParameter> <CssParameter name="fill-opacity">1</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#f03c3f</CssParameter> <CssParameter name="stroke-width">1</CssParameter> </Stroke> </PolygonSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer> </StyledLayerDescriptor> |
XMLデータ読み込み
1 2 3 4 |
var file = "default.sld"; var xml = File.ReadAllText(file, Encoding.UTF8); var sldDoc = new XmlDocument(); sldDoc.LoadXml(xml); |
DocからXMLデータの出力
XmlDocument.OuterXmlでも出力されますが、ネストされていないので、StringWriterに出力させています。
1 2 3 |
var writer = new System.IO.StringWriter()) sldDoc.Save(writer); string str = writer.ToString(); |
Docから複数件のXMLノード抽出
1 2 3 4 5 6 |
var nsm = new XmlNamespaceManager(new NameTable()); nsm.AddNamespace("sld", "http://www.opengis.net/sld"); nsm.AddNamespace("ogc", "http://www.opengis.net/ogc"); nsm.AddNamespace("xlink", "http://www.w3.org/1999/xlink"); XmlNodeList styles = sldDoc.SelectNodes("//sld:FeatureTypeStyle", nsm); |
XMLノードから任意の属性条件の1件のXMLノード抽出
XPATHの属性指定して、任意条件の1件のXMLノード抽出しています。
1 |
var fill = (XmlNode)textSymbolizer.SelectSingleNode("sld:Fill/sld:CssParameter[@name='fill']", nsm); |
XMLノードの値の変更
1 2 |
var format = (XmlNode)polygonSymbolizer.SelectSingleNode("sld:Graphic/sld:ExternalGraphic/sld:Format", nsm); format.InnerText = "image/svg+xml"; |
XMLノードの作成及び追加
XMLノードの追加は、他のドキュメントから作成されたものは追加時にエラーが発生します。
なので自ドキュメントから作成して追加します。
1 2 3 4 |
var graphic = (XmlNode)polygonSymbolizer.SelectSingleNode("sld:Graphic", nsm); var sizeNode = (XmlNode)polygonSymbolizer.OwnerDocument.CreateElement("sld:Size"); sizeNode.InnerText = size; graphic.AppendChild(sizeNode); |
prefix付きのXMLノードの作成及び追加
prefix付きXMLノードの追加は、prefix及び、urlを引数に渡します。
1 2 3 4 |
var prefix = "ogc"; var namespaceURI = nsm.LookupNamespace(prefix); filterNode = (XmlNode)ruleNode.OwnerDocument.CreateElement(prefix, "Filter", namespaceURI); ruleNode.AppendChild(filterNode); |
XMLノードのコピー
XMLノードをクローンし、類似のXMLノードを複製することができます。
配下のノードを作成してくれるので非常に楽です。
1 2 |
XmlNode rule = (XmlNode)sldDoc.SelectSingleNode("//sld:Rule", nsm); XmlNode rule2 = ((XmlNode)rule).Clone(); |