2014-12-17 1 views
3

У меня возникла проблема с удалением пробелов в полях значений в XML-данных.Удалить пробелы в XML-полях с помощью Java

например:

Входной

<?xml version="1.0"?> 
<ns:myOrder xmlns:ns="http://w3schools.com/BusinessDocument" xmlns:ct="http://something.com/CommonTypes"> 
    <MessageHeader> 
    <ct:ID>i7       </ct:ID> 
    <ct:ID>i7       </ct:ID> 
    <ct:ID>i7       </ct:ID> 
    <ct:ID>i7       </ct:ID> 
    <ct:Name> Company Name   </ct:Name> 
</MessageHeader> 
</ns:myOrder> 

Ожидаемый результат:

<?xml version="1.0"?> 
    <ns:myOrder xmlns:ns="http://w3schools.com/BusinessDocument" xmlns:ct="http://something.com/CommonTypes"> 
    <MessageHeader> 
     <ct:ID>i7</ct:ID> 
     <ct:ID>i7</ct:ID> 
     <ct:ID>i7</ct:ID> 
     <ct:ID>i7</ct:ID> 
     <ct:Name>Company Name</ct:Name> 
    </MessageHeader> 
    </ns:myOrder> 

Я попытался с ниже код

public static String getTrimmedXML(String rawXMLFilename) throws Exception 
    { 
      BufferedReader in = new BufferedReader(new FileReader(rawXMLFilename)); 
    String str; 
    String trimmedXML = null;  
    while ((str = in.readLine()) != null) 
    { 
      String str1 = str; 
      if (str1.length()>0) 
      { 
       str1 = str1.trim(); 
       if(str1.charAt(str1.length()-1) == '>') 
       { 
        trimmedXML = trimmedXML + str.trim(); 
       } 
       else 
       { 
        trimmedXML = trimmedXML + str; 
       } 
      } 
    }  
    in.close(); 
    return trimmedXML.substring(4); 
    } 

Я не могу удалить эти пробелы. Пожалуйста, дайте мне знать, где я буду неправильно

С уважением, Мониш

+2

'trim' только удаляет пробелы в начале и в конце строки (в вашем случае строка). Попробуйте разобрать XML, чтобы удалить пробелы и переписать XML. – Jens

+0

Функция xpath 'normalize-space' будет выполнять эту обрезку. Вы можете использовать [измененное 'Identity transform'] (http://en.wikipedia.org/wiki/Identity_transform), чтобы сделать это в XSL. – StuartLC

+0

Если один из ответов помог вам решить проблему, вы можете проверить галочку на нем. Это также дает вам дополнительную репутацию. –

ответ

2

Возможно, вы не захотите использовать замену или заменить все, потому что тогда он заменит все пробелы в ваших xml-данных. Если вы хотите обрезать начало/конец содержимого xml, либо вы хотите проанализировать весь xml или использовать xpath и преобразовать его в строку. Используйте код ниже.

public static String getTrimmedXML(String rawXMLFilename, String tagName) throws Exception { 
    // Create xml document object 
    BufferedReader in = new BufferedReader(new FileReader(rawXMLFilename)); 
    InputSource source = new InputSource(in); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document document = db.parse(source); 
    XPathFactory xpathFactory = XPathFactory.newInstance(); 
    XPath xpath = xpathFactory.newXPath(); 

    // Path to the node that you want to trim 
    NodeList nodeList = (NodeList) xpath.compile("//*[name()='" + tagName + "']").evaluate(document, XPathConstants.NODESET); 
    for (int index = 0; index < nodeList.getLength(); index++) { // Loop through all nodes that match the xpath 
     Node node = nodeList.item(index); 
     String newTextContent = node.getTextContent().trim(); // Actual trim process 
     node.setTextContent(newTextContent); 
    } 

    // Transform back the document to string format. 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer = tf.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    StringWriter writer = new StringWriter(); 
    transformer.transform(new DOMSource(document), new StreamResult(writer)); 
    String output = writer.getBuffer().toString().replaceAll("\n|\r", ""); 
    return output; 
} 
+0

Что делать, если есть несколько тегов, кроме «ct: ID»? Как определить для других тегов. Пожалуйста, дайте мне знать. С уважением, Monish – shockwave

+0

Вы редактируете функцию, чтобы принять другой параметр, который является строкой xpath, и предоставить путь к узлу, который вы хотите подрезать к этой функции. –

+0

Ive отредактировал ответ, чтобы сделать его многоразовым для другого тега. –

-2
метод

Использование replaceAll в Java

для примера

String s1 = "<ct:ID>i7       </ct:ID>"; 
System.out.println(s1.replaceAll(" ","").trim()); 
+0

Это было бы удалить пробелы внутри XML, так что если тег читать что-то вроде '<поле Name = "Version Date"> 03/15/2017 ', что превратило бы атрибут "Version Date" в " VersionDate». Правильное решение не изменит XML. –

0

ИМХО вы должны использовать a XML library, то, возможно, выбрать пострадавших от загрязнения Nodes via XPath, а затем

String value = node.getTextContent(); 
node.setTextContent(value.trim()); 
0

Удаление всех пробелов в строке можно сделать с помощью замены метода класса STRING, например, так:

String str = " random message withlots of white spaces  "; 
str = str.replace(" ", ""); 
System.out.println(str); 

выше будет работать для печати ул без каких-либо пробелов. Метод replace принимает два аргумента: первая - это String, которую вы хотите заменить на второй аргумент, который является другой строкой. Аргументы этого метода не ограничиваются односимвольными строками.

0

Ниже приведен код, удаляющий удаление пробелов в vtd-xml.

import com.ximpleware.*; 
public class removeWS { 

    public static void main(String[] s) throws VTDException, Exception{ 
     VTDGen vg = new VTDGen(); 
     AutoPilot ap = new AutoPilot(); 
     XMLModifier xm = new XMLModifier(); 
     if (vg.parseFile("d:\\xml2\\ws.xml", true)){ 
      VTDNav vn = vg.getNav(); 
      ap.bind(vn); 
      xm.bind(vn); 
      ap.selectXPath("//text()"); 
      int i=-1; 
      while((i=ap.evalXPath())!=-1){ 
       int offset = vn.getTokenOffset(i); 
       int len = vn.getTokenLength(i); 

       long l = vn.trimWhiteSpaces((((long)len)<<32)|offset); 
       System.out.println(" ===> "+vn.toString(i)); 
       System.out.println("len ==>"+len+" new len==>"+ (l>>32)); 
       int nlen = (int)(l>>32); 
       int nos= (int) l; 
       xm.updateToken(i,vn,nos,nlen); 
      } 
      xm.output("d:\\xml2\\new.xml"); 

     } 
    } 
}