【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をごにょごにょしたい時に知っておくと吉!
下記の記事を書く前に知りたかった私。
