2016-07-28 5 views
-1

Например, у меня есть много файлов с подобным шаблоном:Есть простой способ заменить текст в определенном узле XML

<book book_id="foo"> 
    <title>Examples in different languages</title> 
    <book_section>Tutorials</book_section> 
     <body> 
     <p>Some text</p> 
     <section> 
      <sectionheader>if</sectionheader> 
      <sectionbody> 
       <p>Depending on language you use, the sytax will be different:</p> 
       <scriptsample> 
        <language_a> 
         <block> 
          <p> 
           &nbsp;&nbsp;...<br/> 
           &nbsp;&nbsp;<i>Do a comparation</i><br/> 
           &nbsp;&nbsp;<b>if</b> (a == b)<br/><br/> 
           &nbsp;&nbsp;{<br/> 
           &nbsp;&nbsp;&nbsp;&nbsp;do what you want<br/> 
           &nbsp;&nbsp;}<br/> 
          </p> 
         </block> 
        </language_a> 
        <language_b> 
         <block> 
          <p> 
           &nbsp;&nbsp;...<br/> 
           &nbsp;&nbsp;<i>Do a comparation</i><br/> 
           &nbsp;&nbsp;<b>if</b> (a == b)<br/><br/> 
           &nbsp;&nbsp;{<br/> 
           &nbsp;&nbsp;&nbsp;&nbsp;do what you want<br/> 
           &nbsp;&nbsp;}<br/> 
          </p> 
         </block> 
        </language_b> 
       </scriptsample> 
      </sectionbody> 
     </section> 
     <p>Some other text</p> 
     <section> 
      <sectionheader>while</sectionheader> 
      <sectionbody> 
       <p>Depending on language you use, the sytax will be different:</p> 
       <scriptsample> 
        <language_a> 
          <p> 
           &nbsp;&nbsp;...<br/> 
           &nbsp;&nbsp;<i>Do a comparation</i><br/> 
           &nbsp;&nbsp;<b>while</b> (a == b)<br/><br/> 
           &nbsp;&nbsp;{<br/> 
           &nbsp;&nbsp;&nbsp;&nbsp;do what you want<br/> 
           &nbsp;&nbsp;}<br/> 
          </p> 
        </language_a> 
        <language_b> 
          <p> 
           &nbsp;&nbsp;...<br/> 
           &nbsp;&nbsp;<i>Do a comparation</i><br/> 
           &nbsp;&nbsp;<b>while</b> (a == b)<br/><br/> 
           &nbsp;&nbsp;{<br/> 
           &nbsp;&nbsp;&nbsp;&nbsp;do what you want<br/> 
           &nbsp;&nbsp;}<br/> 
          </p> 
        </language_b> 
       </scriptsample> 
      </sectionbody> 
     </section> 
    <body> 
</book> 

Теперь я хочу, чтобы заменить текст (a == b) с compare(a, b) ТОЛЬКО в элементе language_b .

Мне удалось найти все файлы с помощью XPath в Altova XMLSpy, но я не могу изменить файлы.

Я попытался создать для этого регулярное выражение, но мне не удалось.

Кстати, еще одним препятствием является то, что a и b могут быть вызовы методов (obj.method(args)). Таким образом, ее очень трудно использовать регулярное выражение здесь, но это другая задача)

Я также попытался выполнить команду XQuery Apply Update функцию элемента (также в Altova XMLSpy):

for $x in //language_b/*[contains(., 'a == b')] return 
replace value of node $x with (
replace($x, 'a == b', 'compare(a, b)') 
) 

Но она теряет ребенка элементов в «language_b». (например, i, nbsp и т. д.). Кроме того, Altova добавляет атрибуты по умолчанию по всему файлу, что делает меня грустным из-за бесполезных элементов.

Я не верю, что перед моими задачами не было.

Есть ли предложения?

PS. Теперь я пытаюсь создать что-то, используя DOM в C# (но из-за недостатка знаний это займет много времени).

+0

Решите, какую среду программирования вы хотите использовать, а затем дайте ей поиск. Его спрашивали и много раз говорили. – Gordon

+1

Я отправлю фрагмент кода, чтобы сделать это в xpath и vtd-xml .. но вы должны предоставить более конкретный пример того, что критерии замены ... –

ответ

0

Попробуйте использовать dom или stax для этого.