在 XML 文件中用 " 替换双引号
Replace double quote with " in XML file
我有一个 XML 文件,其中包含如下引号
<feast key="NAME" value="NAME TEST 'xxxxx"yyyy' $"/>
我需要将所有出现的 xxxxx"yyyy
替换为 xxxxx"yyyy
。
注意:xxxxx和yyyy由用户定义。所以它可以是任何形式。
这里我包含了示例 XML 和要解析的代码。
TestSaxParse.xml
<?xml version="1.0" encoding="US-ASCII" ?>
<TEST Office="TEST Office">
<LINE key="112313133320">
<TESTNO value="0"/>
<FEATURE>
<feast key="001" value="001"/>
<feast key="NAME" value="NAME TEST 'xxxxx_&_yyyy' $"/>
</FEATURE>
</LINE>
<LINE key="112313133321">
<TESTNO value="0"/>
<FEATURE>
<feast key="002" value="002"/>
<feast key="NAME" value="NAME TEST 'xxxxx"yyyy' $"/>
</FEATURE>
</LINE>
</TEST>
SaxParseEx.java
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParseEx extends DefaultHandler{
private static String xmlFilePath = "/home/system/TestSAXParse.xml";
public static void main(String[] args) {
SaxParseEx SaxParseEx = new SaxParseEx();
SAXParserFactory fact = SAXParserFactory.newInstance();
SAXParser parser;
try {
Path path = Paths.get(xmlFilePath);
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
// replace & with &
content = content.replaceAll( "(&(?!amp;))", "&");
// content = content.replaceAll( "(\"(?!quot;))", """); Need regex to replace " with " only on specific place where i mentioned above
// Write updated content to XML file
Files.write(path, content.getBytes(charset));
// XML Parsing
parser = fact.newSAXParser();
parser.parse(new File(xmlFilePath), SaxParseEx);
System.out.println("PARSE SUCCESS");
return;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("PARSE FAILED");
}
}
O/P
org.xml.sax.SAXParseException; systemId: file:/home/system/TestSAXParse.xml; lineNumber: 14; columnNumber: 46; Element type "feast" must be followed by either attribute specifications, ">" or "/>".
我已将所有 &
替换为 &
以修复第 7 行的 SAXParseException。我无法将 "
替换为 "
编辑:
我无法使用 。由于
,我正在寻找不同的解决方案
- XML 文件较大 ( > 100MB)
- 所以我认为按照答案中的建议编译和替换双引号值内的每一行是不可行的。
- 我正在寻找全部替换为
content = content.replaceAll( "(&(?!amp;))", "&");
有没有可能写出这样的正则表达式?
当 '
括起来时,我将所有 "
替换为 "
。所以我在 Files.write
之前添加了以下几行
Pattern pattern = Pattern.compile("'(.*[\"].*)'");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
content = content.replaceAll(matcher.group(1), matcher.group(1).replace("\"", """));
}
我有一个 XML 文件,其中包含如下引号
<feast key="NAME" value="NAME TEST 'xxxxx"yyyy' $"/>
我需要将所有出现的 xxxxx"yyyy
替换为 xxxxx"yyyy
。
注意:xxxxx和yyyy由用户定义。所以它可以是任何形式。
这里我包含了示例 XML 和要解析的代码。
TestSaxParse.xml
<?xml version="1.0" encoding="US-ASCII" ?>
<TEST Office="TEST Office">
<LINE key="112313133320">
<TESTNO value="0"/>
<FEATURE>
<feast key="001" value="001"/>
<feast key="NAME" value="NAME TEST 'xxxxx_&_yyyy' $"/>
</FEATURE>
</LINE>
<LINE key="112313133321">
<TESTNO value="0"/>
<FEATURE>
<feast key="002" value="002"/>
<feast key="NAME" value="NAME TEST 'xxxxx"yyyy' $"/>
</FEATURE>
</LINE>
</TEST>
SaxParseEx.java
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParseEx extends DefaultHandler{
private static String xmlFilePath = "/home/system/TestSAXParse.xml";
public static void main(String[] args) {
SaxParseEx SaxParseEx = new SaxParseEx();
SAXParserFactory fact = SAXParserFactory.newInstance();
SAXParser parser;
try {
Path path = Paths.get(xmlFilePath);
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
// replace & with &
content = content.replaceAll( "(&(?!amp;))", "&");
// content = content.replaceAll( "(\"(?!quot;))", """); Need regex to replace " with " only on specific place where i mentioned above
// Write updated content to XML file
Files.write(path, content.getBytes(charset));
// XML Parsing
parser = fact.newSAXParser();
parser.parse(new File(xmlFilePath), SaxParseEx);
System.out.println("PARSE SUCCESS");
return;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("PARSE FAILED");
}
}
O/P
org.xml.sax.SAXParseException; systemId: file:/home/system/TestSAXParse.xml; lineNumber: 14; columnNumber: 46; Element type "feast" must be followed by either attribute specifications, ">" or "/>".
我已将所有 &
替换为 &
以修复第 7 行的 SAXParseException。我无法将 "
替换为 "
编辑:
我无法使用
- XML 文件较大 ( > 100MB)
- 所以我认为按照答案中的建议编译和替换双引号值内的每一行是不可行的。
- 我正在寻找全部替换为
content = content.replaceAll( "(&(?!amp;))", "&");
有没有可能写出这样的正则表达式?
当 '
括起来时,我将所有 "
替换为 "
。所以我在 Files.write
Pattern pattern = Pattern.compile("'(.*[\"].*)'");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
content = content.replaceAll(matcher.group(1), matcher.group(1).replace("\"", """));
}