【C#】XmlDocumentでSVGを処理する時のXPathExceptionをなんとかする
C#でXmlDocument
を使ってSVGを処理する時のXPathException
をなんとかしたい!
概要
今回の記事では、C#でXmlDocument
を使ってSVGを処理する時のXPathException
に対応する手順を掲載する。
仕様書
- .NET 6
手順書
下記は例外XPathException
が発生する例。
class Program
{
static void Main(string[] args)
{
var xml = new XmlDocument();
xml.Load("sample.svg");
var node = xml.SelectSingleNode("/a:svg/a:g/a:g/a:g/a:rect");
}
}
メゾットSelectSingleNode
の部分で下記の例外が発生してしまう。
System.Xml.XPath.XPathException: 'Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.'
C#でXmlDocument
を使ってSVGを読み込んで処理を行う場合は、名前空間を追加する必要がある。
下記は例外が発生しない例。
class Program
{
static void Main(string[] args)
{
var xml = new XmlDocument();
xml.Load("sample.svg");
var xmlNamespaceManager = new XmlNamespaceManager(xml.NameTable);
xmlNamespaceManager.AddNamespace("a", "http://www.w3.org/2000/svg");
var n = xml.SelectSingleNode("/a:svg/a:g/a:g/a:g/a:rect", xmlNamespaceManager);
}
}
下記の部分で名前空間を追加してる。"a"
が名前空間になる文字列。任意の文字列で良いっぽい。
var xmlNamespaceManager = new XmlNamespaceManager(xml.NameTable);
xmlNamespaceManager.AddNamespace("a", "http://www.w3.org/2000/svg");
メゾットSelectSingleNode
の第2引数にインスタンス化したXmlNamespaceManager
を渡す。
var n = xml.SelectSingleNode("/a:svg/a:g/a:g/a:g/a:rect", xmlNamespaceManager);
メゾットSelectNodes
も同様に第2引数にXmlNamespaceManager
を渡す。
var nodes = xml.SelectNodes("/a:svg/a:g/a:g/a:g/a:rect", xmlNamespaceManager);
まとめ(感想文)
SVGをごにょごにょしたい時に知っておくと吉!
下記の記事を書く前に知りたかった私。