ReplaceWith XElement

时间:2016-01-05 17:46:27

标签: c# xml xml-parsing linq-to-xml xelement

以下是我的XDocument的内容片段。

    <p style="">
            <img id="Object3"  src="Object3_png16malpha.png" width="78" height="37" />
    </p>
    <p style="">
        <span>1 point: correct response of Point </span>X: 
        <img id="Object4"  src="Object4_png16malpha.png" width="76" height="37" /> Point y: 
        <img id="Object5"  src="Object5_png16malpha.png" width="78" height="37" /> Point z: 
        <img id="Object6"  src="Object6_png16malpha.png" width="78" height="37" />. 
        <span style="">(1 point).</span>
    </p>
<accessElement identifier="1234">
    <contentLinkInfo LinkIdentifierRef="9_BEGIN" type="Text">
        <objectLink />
    </contentLinkInfo>
</accessElement>

基本上我正在尝试用新内容替换每个图片<img>标记。对于Object3的图像<Tag>,在处理后如下所示。

<span class="mathml" data-png="Object3_png16malpha.png" data-svg="Object3_png16malpha.svg">
    <img id="Object3" alt="" src="Object3_png16malpha.png" />
</span>

但下面是输出我正在获取哪些图像标签的处理,我不确定。

<p style="">
        <span class="mathml" data-png="Object3_png16malpha.png" data-svg="Object3_png16malpha.svg">
            <img id="Object3" alt="" src="Object3_png16malpha.png" />
    </span>
</p>
<p style="">
    <span>1 point: correct response of Point </span>X: 
    <span class="mathml" data-png="Object4_png16malpha.png" data-svg="Object4_png16malpha.svg">
        <img id="Object4" alt="" src="Object4_png16malpha.png" />
    </span> Point y: 
    <img id="Object5"  src="Object5_png16malpha.png" width="78" height="37" /> Point z: 
    <img id="Object6"  src="Object6_png16malpha.png" width="78" height="37" />. 
    <span style="">(1 point).</span>
</p>
<accessElement identifier="1234">
    <contentLinkInfo LinkIdentifierRef="9_BEGIN" type="Text">
        <objectLink />
    </contentLinkInfo>
</accessElement>

以下是我的代码片段

  foreach (XElement bodyElement in uthDocument.Descendants().Elements())
        {
            if (bodyElement.Name == "img")
            {
                XElement newImageElement = getNewImageElement(bodyElement);
                bodyElement.ReplaceWith(newImageElement);
            }

        }

我的代码确实跳过了最后两个图像元素的替换。

1 个答案:

答案 0 :(得分:1)

LINQ to XML的结构类似于链表 - 每个节点都拥有对其下一个节点的引用。

当您用新的bodyElement替换原来的bodyElement时,null指向的下一个节点现在是Elements(),因为您已将其从树中取出。因此,最有可能的是,您的一个迭代器将在此时断开并返回。

另外,您也不需要Descendants()调用,因为您最终会多次迭代大多数元素。 Descendants()将返回以下所有元素。

所以,只需急切地评估foreach (XElement bodyElement in uthDocument.Descendants().ToList()) { ... } 并反复思考:

ToList()

理想情况下,您在调用XNamespace xhtml = "http://www.w3.org/1999/xhtml"; var imgElements = uthDocument.Descendants(xhtml + "img").ToList(); 之前会对此进行过滤。假设这是XHTML,这很简单:

{{1}}