在SVG(XML)中的现有元素之后插入新元素

时间:2019-05-23 20:58:34

标签: c# svg xml-parsing

我想在现有元素之后插入一个元素。例如,在这个简单的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根目录和defs为空,因此自然而然地行defs.AddAfterSelf(xE);抛出未设置对象引用错误。

任何指导表示赞赏。

1 个答案:

答案 0 :(得分:1)

尝试使用命名空间

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);