2016-01-05 3 views
0

Ниже приведен фрагмент содержимого моего XDocument.ReplaceWith XElement

<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> тег с новым содержанием. Для изображения <Tag> объекта Object3 выглядит следующим образом после обработки.

<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

Структура LINQ to XML Сродна связанному списку - каждый узел содержит ссылку на свой следующий узел.

При замене оригинал bodyElement с новым, то на следующий узел, на который указывает bodyElement теперь null как вы вытащил его из дерева. Таким образом, скорее всего, один из ваших итераторов тогда сломается и вернется в этот момент.

Как и в стороне, вам также не нужен ваш вызов Elements(), так как вы в конечном итоге повторяете большинство элементов более одного раза. Descendants() вернет все элементы ниже.

Так, только жадно оценить 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();