1

SVG文字列を解析して特定の要素を削除してから返すWebサービスメソッドがあります。

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

まず、なぜ0なCountのですか?inner

第二に、これは要素を「削除」する正しい方法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>
4

2 に答える 2

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と名前空間の問題を扱う便利なリンクがあります。

于 2012-10-12T22:23:20.510 に答える
1

SVGには正しい名前空間が含まれているため、クエリで指定する必要があります。これらのURLを確認してください。

于 2012-10-12T21:52:16.290 に答える