【C#】XmlDocumentでSVGを処理する時のXPathExceptionをなんとかする

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【C#】XmlDocumentでSVGを処理する時のXPathExceptionをなんとかする

2023-1-6 | , ,

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をごにょごにょしたい時に知っておくと吉!

下記の記事を書く前に知りたかった私。