2016-09-01 8 views
1

XML宣言の直前のUIDを含むXMLを解析する必要があるため、無効と見なされます。私は文字列(それは10桁とドル記号で構成されるID)を見つけて""に置き換えるためにJava Pattern/Matcherを使用する追加ステップを含んでいます。問題のファイルの拡張子が.txtであり、名前が変更される直前に置換が行われる(私は小さなユーティリティを書きました)と解析されるように読み込まれることを追加する必要があります。ここでXMLのスナップショットです:Java PatternとMatcherを使用してXML宣言の前に文字列を検索し置換する

UID$<?xml version="1.0" encoding="utf-16"?> 
<RootElement 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="some-namespace"> 
    <ElementA attribute1a="1123" attribute2a= "3321.67"> 
     <ElementB="" attribute1b="2.46464" attribute2b="1.2345454"></ElementB> 
    </ElementA> 
</RootElement> 

これは、検索/ルーチン置き換えるためのJavaクラスです:

import java.io.BufferedReader; 
    import java.io.BufferedWriter; 
    import java.io.File; 
    import java.io.FileReader; 
    import java.io.FileWriter; 
    import java.io.IOException; 
    import java.io.Writer; 
    import java.net.URI; 
    import java.nio.charset.StandardCharsets; 
    import java.nio.file.Files; 
    import java.nio.file.Paths; 
    import java.util.ArrayList; 
    import java.util.List; 
    import java.util.regex.Matcher; 
    import java.util.regex.Pattern; 

    public class FindReplace { 

     public static void main(String[] args) throws IOException { 

      String originalFile = "D:\\invalid.txt"; 
      String outputFile = "D:\\_valid.txt"; 

      String search = "^[0-9]{10}\\$"; 
      String replace = ""; 

      BufferedReader br = new BufferedReader(new FileReader(originalFile)); 
      File newFile = new File(outputFile); 

      Writer writer = new BufferedWriter(new FileWriter(newFile)); 
      String lineContents; 
      while ((lineContents = br.readLine()) != null) { 
       Pattern pattern = Pattern.compile(search); 
       Matcher matcher = pattern.matcher(lineContents); 
       while (matcher.find()) { 
        int count = 0; 
        count++; 
        System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end()); 
        String lineByLine = lineContents.replaceAll(search, replace); 
        writer.write(lineByLine); 
        System.out.println("This prints the content line by line: " + lineContents); 
       } 
      } 
      writer.close(); 
      br.close(); 
     } 
    } 

置換が正常に実行されているが、私は唯一のXML宣言で返されています:

<?xml version="1.0" encoding="utf-16"?> 

残りのXMLが破棄される場合。

なぜこれが起こっているのかわかりません。お手伝いできますか?

は、有効な(だから、「UIDの$」を含む行は""に置き換えることにしたいと、別のファイルにファイルの内容の残りの部分をコピー

I.

答えて

2

、どうもありがとうございました。TXT)。

現在、ファイルをループする場所では、残りのファイルをスキップします。代わりに、次のようなリファクタリングによって新しいファイルに書き込むことができます:

while ((lineContents = br.readLine()) != null) { 
      Pattern pattern = Pattern.compile(search); 
      Matcher matcher = pattern.matcher(lineContents); 
      int count = 0; 
      count++; 
      if (matcher.find()) { 
       System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end()); 
       String lineByLine = lineContents.replaceAll(search, replace); 
       writer.write(lineByLine); 
      } else { 
       System.out.println("This prints the content line by line: " + lineContents); 
       writer.write(lineContents + "\n"); 
      } 
     } 
関連する問題