替换为 XElement
ReplaceWith 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);
}
}
我的代码确实跳过了最后两个图像元素的替换。
LINQ to XML 的结构类似于链表 - 每个节点都包含对其下一个节点的引用。
当您用新的 bodyElement
替换原来的 bodyElement
时,bodyElement
指向的下一个节点现在是 null
,因为您已将其从树中拉出。因此,很可能您的其中一个迭代器将在此时中断并 return。
顺便说一句,您也不需要 Elements()
调用,因为您最终会多次迭代大多数元素。 Descendants()
将 return 下面的所有元素。
所以,只需热切地评估 Descendants()
并迭代它:
foreach (XElement bodyElement in uthDocument.Descendants().ToList())
{
...
}
理想情况下,您应该在调用 ToList()
之前对其进行过滤。假设这是 XHTML,这相当简单:
XNamespace xhtml = "http://www.w3.org/1999/xhtml";
var imgElements = uthDocument.Descendants(xhtml + "img").ToList();
下面是我的 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);
}
}
我的代码确实跳过了最后两个图像元素的替换。
LINQ to XML 的结构类似于链表 - 每个节点都包含对其下一个节点的引用。
当您用新的 bodyElement
替换原来的 bodyElement
时,bodyElement
指向的下一个节点现在是 null
,因为您已将其从树中拉出。因此,很可能您的其中一个迭代器将在此时中断并 return。
顺便说一句,您也不需要 Elements()
调用,因为您最终会多次迭代大多数元素。 Descendants()
将 return 下面的所有元素。
所以,只需热切地评估 Descendants()
并迭代它:
foreach (XElement bodyElement in uthDocument.Descendants().ToList())
{
...
}
理想情况下,您应该在调用 ToList()
之前对其进行过滤。假设这是 XHTML,这相当简单:
XNamespace xhtml = "http://www.w3.org/1999/xhtml";
var imgElements = uthDocument.Descendants(xhtml + "img").ToList();