2016-08-16 5 views
2

У меня есть XML-файл, который содержит кавычки следующим образомЗаменить двойные кавычки с " в XML файл

<feast key="NAME" value="NAME TEST 'xxxxx"yyyy' $"/>

Мне нужно заменить xxxxx"yyyy на xxxxx&quot;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 &amp; 
      content = content.replaceAll("(&(?!amp;))", "&amp;"); 
      // content = content.replaceAll("(\"(?!quot;))", "&quot;"); Need regex to replace " with &quot; 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 "/>". 

я заменить все & с &amp; зафиксировать SAXParseException на линии № 7. Я не могу заменить " с &quot;

EDIT:

Я не могу использовать this answer. Я ищу другое решение из-за

  1. XML-файл большого размера (> 100MB)
  2. Так я думаю, что это не представляется возможное собрать и заменить каждую строку в пределах значений двойных кавычек, как предложено в ответе ,
  3. Я ищу заменить все как как

content = content.replaceAll("(&(?!amp;))", "&amp;");

Есть ли возможность написать регулярное выражение, как это?

+0

Параметр '' & ', прежде чем GT; и' л; 'не должен быть заменен либо, по-моему. Это должно быть 'content.replaceAll (" & (?! amp; | [gl] t;) "," & ");' –

+1

, поскольку ваш xml недействителен, чтобы начать с него логически, не может быть проанализирован. Проблема заключается в том, что '' xxxxx "' заканчивает тэг xml и вы получаете ошибку синтаксического анализа. – SomeJavaGuy

+2

проверьте следующие темы: http://stackoverflow.com/questions/33744460/java-removing-the-double-quotes- in-xml-attributes http://stackoverflow.com/questions/37176682/replace-double-quotes-within-attributes-only-in-xml-c-sharp –

ответ

0

Я заменил все " на &quot;, когда он прилагается к '. Так я добавил ниже линии, прежде чем Files.write

Pattern pattern = Pattern.compile("'(.*[\"].*)'"); 
Matcher matcher = pattern.matcher(content); 
while (matcher.find()) { 
    content = content.replaceAll(matcher.group(1), matcher.group(1).replace("\"", "&quot;")); 
} 
Смежные вопросы