c# - 在 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); 引发对象引用未设置错误。
任何指导表示赞赏。
解决方案
用命名空间试试这个
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);
推荐阅读
- java - 无法在 Spring Data Elasticsearch 中使用带有分页的 _source
- r - 在 R 中的双向 ANOVA 中为 Tukey 的 HSD 选择的输出
- sql - 如何将自定义 YoY 字段添加到输出?
- javascript - Fullcalendar 如何从 PHP 加载 BusinessHours
- c# - 将我的用户定义函数作为 DLL 加载到 SQL 时出现“添加程序集”错误
- ruby-on-rails - 通过 has_many 删除/销毁 join_table 上的记录
- reactjs - React 开发工具将组件显示为
- apache-kafka-streams - Spring Cloud Kafka 流活页夹运行状况为“未知”
- sqlite - sqlite3 将两个表字段合并为一个,去除重复项
- sql - SQL 按日期全选