Как удалить пробелы между тегами в XML

Я создал XML-документ с помощью Java в своем приложении для Android. Я должен вызвать веб-службу в своем приложении и передать туда этот XML в качестве аргумента. Но моя проблема в том, что между каждым тегом в XML создается пробел.

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();

Element root = doc.createElement("subscriber");
doc.appendChild(root);

//creating child node for username
EditText txtusername=(EditText)findViewById(R.id.txtUserName);
subscriber[0]=String.valueOf(txtusername.getText());
Element UserName=doc.createElement("UserName");             
UserName.setTextContent(subscriber[0]);
root.appendChild(UserName);

//creating child node for PASSWORD 
EditText txtPassword=(EditText)findViewById(R.id.txtPassword);
subscriber[1]=String.valueOf(txtPassword.getText());
Element Password=doc.createElement("Password");
Password.setTextContent(subscriber[1]);
root.appendChild(Password);

//set up a transformer
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");

//create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
String xmlString =sw.toString();

url = new URL("http://192.168.70.14/NewsLetter/subscribing.php?register= " + xmlString);

conn = (HttpURLConnection) url.openConnection();
conn.addRequestProperty("Content-Type", "text/xml; charset=UTF-8"); 
dis = conn.getInputStream();

XML:

<subscriber> <UserName>miya</UserName> <Password>today</Password> </subscriber>

Пожалуйста, дайте решение, как убрать пробелы между тегами UserName и Password.


person Miya    schedule 25.11.2010    source источник
comment
‹подписчик› ‹Имя пользователя›miya‹/Имя пользователя› ‹Пароль›сегодня‹/Пароль› ‹/подписчик›   -  person Miya    schedule 25.11.2010
comment
Похоже, вы подаете свой XML-документ в качестве входных данных для XSLT-преобразования. Существует несколько способов работы с текстовыми узлами, состоящими только из пробелов, в XSLT. Пожалуйста, перемаркируйте и опубликуйте свою таблицу стилей, чтобы мы могли вам помочь.   -  person    schedule 25.11.2010


Ответы (7)


Конечно, это зависит от самого вашего XML. Однако вы можете попробовать использовать регулярные выражения.

Например:

yourXmlAsString.replaceAll(">[\\s\r\n]*<", "><");

Удалит все пробелы между каждым элементом XML.

person Knossos    schedule 25.11.2010
comment
Когда я использую приведенное выше регулярное выражение, оно показывает ошибку: Недопустимое регулярное выражение - person Miya; 25.11.2010


Мне удалось удалить пробелы/табуляции/новые строки из моего преобразования, используя следующее свойство:

transformer.setOutputProperty(OutputKeys.INDENT, "no");

Вы установили его на да. Я уверен, что этот вопрос достаточно устарел, чтобы сейчас это не имело значения; но если кто-то столкнется с этим в будущем, установка свойства на no спасла меня.

person Gaʀʀʏ    schedule 21.05.2013

Это регулярное выражение (?:>)(\s*)<

Когда вы используете его в коде для Java, используйте "(?:>)(\\s*)<" и замените на "><"

String xmlString = "<note>    <to>Tove</to>    <from>Jani</from <heading>Reminder</heading> <title>Today</title>    <body>Don't forget me this weekend!</body>    </note>";

String str = xmlString.replaceAll("(?:>)(\\s*)<", "><");

Это удалит пробелы между тегами и сохранит пробелы для значения.

Вход:

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading> <title>Today</title>
    <body>Don't forget me this weekend!</body>
</note>

Выход:

<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><title>Today</title><body>Don't forget me this weekend!</body></note>
person dilipktr    schedule 12.04.2019

Ни один из других ответов не работал для меня. Мне пришлось использовать приведенный ниже код, чтобы удалить как дополнительные пробелы, так и новые строки.

xmlString.trim().replace("\n", "").replaceAll("( *)<", "<")
person Dinu94    schedule 03.05.2019

Это сработало для меня, спасибо. В качестве предостережения, хотя это действительно полезно для моей цели, я заметил, что он также может удалять текстовое содержимое, если оно состоит только из пробелов. Например, запустив следующее:

String xmlIn = "<tag> </tag> <tag>\t</tag>\t <tag>\r\n</tag><tag> text </tag>";
String xmlOut = xmlIn.replaceAll("(?:>)(\\s*)<", "><");
System.out.println(xmlOut);

дает следующее:

<tag></tag><tag></tag><tag></tag><tag> text </tag>
person Nick M    schedule 17.01.2020

Вы можете создать копию всех узлов в документе и обрезать nodeValue каждого узла, если он существует.

const copyChildrenNodesWithoutWhiteSpace = (document) => {
  const clone = document.cloneNode();

  for (const child of document.childNodes) {
    const childCopy = copyChildrenNodesWithoutWhiteSpace(child);
    clone.appendChild(childCopy);

    if (childCopy.nodeValue) {
      childCopy.nodeValue = childCopy.nodeValue.trim();
    }
  }

  return clone;
};

const result = copyChildrenNodesWithoutWhiteSpace(anyDocument);
person Luis Banegas Saybe    schedule 26.07.2020
comment
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более полезны и качественны, и с большей вероятностью привлекут положительные голоса. - person 7uc1f3r; 26.07.2020