2017-06-18 11 views
0

私はXML文字列を取得するメソッドを持っています。理論的には、すべての特定のタグの前にコメントを挿入する必要があります。私はそれは私が追加して正しく文字列を反復処理する方法がわからないので、addCommentXML("somereallylongxml", "second", "it’s a comment")特定の文字列内の文字列を検索して挿入する方法

public static String addCommentXML(String xmlString, String tagName, String comment) 
{ 
    StringBuilder sb = new StringBuilder(xmlString); 
    for(int i = 0; i < sb.toString().length(); i++) 
    { 
     if(sb.toString().toLowerCase().contains("<"+tagName+">")) 
     { 
     sb.insert(sb.toString().indexOf("<"+tagName+">", i) - 1, "<!--"+ comment+"-->"+"\n"); 
     } 
    } 
    return sb.toString();     
} 

出力が

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 

<first> 

<!--it's a comment--> 

<second>some string</second> 

<!--it's a comment--> 

<second>some string</second> 

<!--it's a comment--> 

<second><![CDATA[need CDATA because of <and>]]></second> 

<!--it's a comment--> 

<second/> 

</first> 

でなければなりません。しかし、それは明らかに動作しません動作させるためにどのように疑問に思いますすべてのタグ名の前に、最初だけでなく、私たちは無限ループを取得します。どうやってやるの?

+0

これは正規表現で行う必要があります。 –

+0

しかし、ここで私は前に何かを追加する必要があります。 –

答えて

0

ここで提案soliutionは非常に簡単ものである:一緒に部品を接合との間でコメントとタグ名を挿入し、その後、タグ名の入力を分割します。

public static String addCommentXML(String xmlString, String tagName, String comment) 
{ 
    String[] parts = xmlString.split("\\Q<" + tagName + ">\\E"); 
    String output = parts[0]; 
    for (int i = 1 ; i < parts.length ; i++) { 
     output += comment + "<" + tagName + ">" + parts[i]; 
    } 
    return output; 
} 

プロ:なしサードパーティ製のlibには
詐欺を必要としない:この方法は本当に時にはそれがerronous結果を生成することができ、そのため、XMLを解析しません(タグはコメントの中に発見された場合のような...)

1

JSOUPライブラリで簡単に実行できます。 HTML/XMLで作業するのに最適なツールです。あなたのケースに

https://jsoup.org/

https://mvnrepository.com/artifact/org.jsoup/jsoup/1.10.3

それは次のようになります。

public static void main(String[] args) { 
    String processedXml = addCommentXML(getDocument(), "second", "it's a comment"); 
    System.out.println(processedXml); 
} 

private static String addCommentXML(String xmlString, String tagName, String comment) { 
    Document document = Jsoup.parse(xmlString); 
    document.getElementsByTag(tagName).before("<!--" + comment + "-->"); 
    return document.toString(); 
} 

private static String getDocument() { 
    return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + 
      "<first>\n" + 
      "<second>some string</second>\n" + 
      "<second>some string</second>\n" + 
      "<second><![CDATA[need CDATA because of <and>]]></second>\n" + 
      "<second/>\n" + 
      "</first>"; 
} 

出力

<html> 
 
<head></head> 
 
<body> 
 
    <first> 
 
    <!--it's a comment--> 
 
    <second> 
 
    some string 
 
    </second> 
 
    <!--it's a comment--> 
 
    <second> 
 
    some string 
 
    </second> 
 
    <!--it's a comment--> 
 
    <second> 
 
    need CDATA because of &lt; and &gt; 
 
    </second> 
 
    <!--it's a comment--> 
 
    <second /> 
 
    </first> 
 
</body> 
 
</html>

関連する問題