2016-07-28 7 views
-1

Zum Beispiel zu ersetzen, habe ich eine Menge von Dateien mit einer ähnlichen Vorlage:Gibt es eine einfache Möglichkeit, einen Text in einem bestimmten Knoten von 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> 

Jetzt mag ich den Text (a == b) mit compare(a, b) ersetzen NUR im Element language_b.

Ich habe alle Dateien mit XPath in Altova XMLSpy gefunden, aber ich kann die Dateien nicht ändern.

Ich habe versucht, einen regulären Ausdruck dafür zu erstellen, aber ich scheiterte.

By the way, ist ein anderes Hindernis, das a und b Methodenaufrufe werden können (obj.method(args)). So ist es wirklich schwer, hier regulären Ausdruck zu verwenden, aber es ist eine andere Aufgabe)

Ich habe auch versucht Nehmen eine XQuery zu tun Feature Update-Element (auch in Altova XMLSpy):

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

Aber es verliert Kind Elemente innerhalb der "Sprache_b". (wie i, nbsp und so weiter). Altova fügt auch Standardattribute für die gesamte Datei hinzu, was mich wegen nutzloser Elemente traurig macht.

Ich glaube nicht, dass es solche Aufgaben nicht vor mir gab.

Gibt es irgendwelche Vorschläge?

PS. Jetzt versuche ich, etwas zu schaffen, indem ich DOM in C# verwende (aber wegen des Mangels an Wissen wird es lange dauern)

+0

Entscheiden Sie, welche Programmierumgebung Sie verwenden möchten, und suchen Sie danach. Es wurde schon oft gefragt und beantwortet. – Gordon

+1

Ich werde einige Code-Snippets in xpath und vtd-xml veröffentlichen. Sie müssen jedoch ein konkreteres Beispiel für das Ersetzungskriterium angeben ... –

Antwort

0

Versuchen Sie, dom oder stax dafür zu verwenden.