查找具有XDocument的元素返回零结果

时间:2012-10-12 21:44:13

标签: c# xml linq

我有一个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();

首先,为什么Countinner 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>

2 个答案:

答案 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具有正确的命名空间,因此您必须在查询中指定它。检查这些网址: