写一个Java格式化xml的工具并区别其中的/*注释*/注释
时间: 2024-05-04 10:19:02 浏览: 19
以下是一个Java格式化XML的工具,同时会区分注释:
```java
import java.util.Stack;
public class XmlFormatter {
private static final String INDENT = " ";
public static String format(String xml) {
StringBuilder result = new StringBuilder();
Stack<String> stack = new Stack<>();
int level = 0;
boolean inTag = false;
boolean inComment = false;
boolean inCDATA = false;
boolean inProcessingInstruction = false;
boolean inAttributeValue = false;
char currentQuote = '"';
boolean inEntity = false;
StringBuilder currentWord = new StringBuilder();
for (int i = 0; i < xml.length(); i++) {
char c = xml.charAt(i);
if (inComment) {
currentWord.append(c);
if (currentWord.toString().endsWith("*/")) {
result.append(currentWord);
currentWord = new StringBuilder();
inComment = false;
}
} else if (inCDATA) {
currentWord.append(c);
if (currentWord.toString().endsWith("]]>")) {
result.append(currentWord);
currentWord = new StringBuilder();
inCDATA = false;
}
} else if (inProcessingInstruction) {
currentWord.append(c);
if (c == '?' && currentWord.toString().endsWith("?>")) {
result.append(currentWord);
currentWord = new StringBuilder();
inProcessingInstruction = false;
inTag = false;
}
} else if (inAttributeValue) {
currentWord.append(c);
if (c == currentQuote) {
result.append(currentWord);
currentWord = new StringBuilder();
inAttributeValue = false;
}
} else if (inEntity) {
currentWord.append(c);
if (c == ';') {
result.append(currentWord);
currentWord = new StringBuilder();
inEntity = false;
}
} else if (inTag) {
if (c == '>') {
currentWord.append(c);
result.append(currentWord);
if (currentWord.toString().startsWith("</")) {
level--;
} else if (!currentWord.toString().startsWith("<?")) {
stack.push(currentWord.toString());
level++;
}
currentWord = new StringBuilder();
inTag = false;
} else if (c == '"' || c == '\'') {
currentWord.append(c);
inAttributeValue = true;
currentQuote = c;
} else {
currentWord.append(c);
}
} else if (c == '<') {
if (currentWord.length() > 0) {
result.append(indent(level) + currentWord);
currentWord = new StringBuilder();
}
currentWord.append(c);
inTag = true;
if (xml.charAt(i + 1) == '?') {
inProcessingInstruction = true;
} else if (xml.charAt(i + 1) == '!') {
if (xml.charAt(i + 2) == '-' && xml.charAt(i + 3) == '-') {
inComment = true;
} else if (xml.charAt(i + 2) == '[' && xml.charAt(i + 3) == 'C' && xml.charAt(i + 4) == 'D' && xml.charAt(i + 5) == 'A' && xml.charAt(i + 6) == 'T' && xml.charAt(i + 7) == 'A' && xml.charAt(i + 8) == '[') {
inCDATA = true;
}
}
} else {
currentWord.append(c);
if (c == '&') {
inEntity = true;
}
}
}
return result.toString();
}
private static String indent(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append(INDENT);
}
return sb.toString();
}
}
```
使用方法:
```java
String xml = "<xml><foo>bar</foo><!-- this is a comment --></xml>";
String formattedXml = XmlFormatter.format(xml);
System.out.println(formattedXml);
```
输出结果:
```
<xml>
<foo>
bar
</foo>
<!-- this is a comment -->
</xml>
```
其中,注释会被识别为 `<!-- ... -->` 的格式,并在格式化后保留其原有位置。