我有一个Web服务方法,它解析SVG字符串以删除某些元素,然后将其返回。
以下是SVG字符串的一部分:
<g id="wrapper">
<g id="inner">
<title>Layer 1</title>
...etc
这是代码:
XDocument x2 = XDocument.Parse(svgString);
var inner = (from el in x2.Root.Elements("g")
where (string)el.Attribute("id") == "inner"
select el);
inner.Remove();
return x2.ToString();
首先,为什么Count
为inner
0?
其次,这是“删除”元素的正确方法,还是我需要在返回之前以某种方式保存XDocument
?
编辑:这里是完整的SVG字符串:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"[]>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px" width="374.173px" height="524.409px" viewbox="0 0 374.173 524.409"
enable-background="new 0 0 374.173 524.409" xml:space="preserve">
<g id="wrapper">
<g id="inner">
<title>Layer 1</title>
<defs>
<rect id="SVGID_1_" x="16.086" y="98.896" width="344.903" height="413.334" />
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible" />
</clipPath>
<g clip-path="url(#SVGID_2_)">
<defs>
<rect id="SVGID_3_" x="-8.96" y="53.896" width="382.524" height="473.956" />
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" overflow="visible" />
</clipPath>
<g transform="matrix(1 0 0 1 3.341429e-007 -1.529841e-006)" clip-path="url(#SVGID_4_)">
<image overflow="visible" width="367" height="445" id="img11" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEARQBFAAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA EAMCAwYAAAlpAAAVEAAANsH/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISF...........">
</image>
</g>
</g>
</g>
</g>
<g>
<title>Layer 2</title>
<text transform="matrix(1 0 0 1 61.3745 48.5068)"><tspan x="0" y="0" fill="#9FA1A4" font-family="'Noteworthy-Bold'" font-size="24">testing 123</tspan></text>
</g>
</svg>
答案 0 :(得分:2)
Elements
搜索直接子项,因此如果您的结构嵌套在某个根标记中,则x2.Root
的直接子项将为<g id="wrapper">
。请改用Descendants
:
var inner = x2.Root.Descendants("g")
.Where(e => e.Attribute("id").Value == "inner");
编辑:由于您的根节点定义了默认命名空间,因此您需要在查询中包含该命名空间:
XNamespace n = @"http://www.w3.org/2000/svg";
var inner = x2.Root
.Descendants(n + "g")
.Where(e => e.Attribute("id") != null)
.Where(e => e.Attribute("id").Value == "inner")
这是处理LINQ2XML和命名空间问题的useful link。
答案 1 :(得分:1)
您的SVG具有正确的命名空间,因此您必须在查询中指定它。检查这些网址: