首页 > 解决方案 > 在 SVG (XML) 中的现有元素之后插入新元素

问题描述

我想在现有元素之后插入一个元素。例如,在这个简单的 XML 文件中,我想在“defs”元素之后插入一个元素。

<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 790 790" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,790 790,790 790,0 0,0 z" />
</clipPath>
</defs>
****I WANT TO INSERT MY NEW ELEMENT HERE
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.5" />
<g clip-path="url(#clipId0)" fill="rgb(0,255,0)" stroke="rgb(0,255,0)" stroke-width="0" >
<text transform="matrix(12.0023 0 -0 12.0023 130.206 546.583)" font-family="Arial,'sans-serif'" font-size="1.39636" >WORK REGION</text>
</g>
</svg>

这是我尝试的 c# 代码:

    public void AddBlackBackground(string xOrig, string yOrig, string xExt, string yExt )
    {
        XElement xE = new XElement("rect");
        xE.Add(new XAttribute("x", xOrig));
        xE.Add(new XAttribute("y", xOrig));
        xE.Add(new XAttribute("width", xOrig));
        xE.Add(new XAttribute("height", xOrig));
        xE.Add(new XAttribute("style", "fill:black"));

        XElement root = _XML_Doc.Root.Element("svg");
        XElement defs = root.Element("defs");
        defs.AddAfterSelf(xE);
    }

当我运行代码时,XElements root 和 defs 为空,所以很自然地是 defs.AddAfterSelf(xE); 引发对象引用未设置错误。

任何指导表示赞赏。

标签: c#svgxml-parsing

解决方案


用命名空间试试这个

var ns = _XML_Doc.Root.Name.Namespace;
XElement root = _XML_Doc.Element(ns +"svg");
XElement defs = root.Element(ns + "defs");
defs.AddAfterSelf(xE);

或者忽略命名空间

_XML_Doc.Root
  .DescendantsAndSelf()
  .Elements()
  .Single(d => d.Name.LocalName == "defs")
  .AddAfterSelf(xE);

推荐阅读