Допустимый SQL требует кавычек около даты:
update job_status set start_dttm='2019-03-04 04:50:12';
Следовательно, вам потребуется
paste0("update job_status set start_dttm='", as.character(sys.time(), "';")
Вышеуказанный запрос защищен от внедрения SQL, поскольку sys.time()
должен быть в безопасности. Однако в целом (и особенно когда аргументы получены из пользовательского ввода), лучше использовать параметризованный SQL, чтобы избежать внедрения SQL .
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
//initialize StreamResult with File object to save to file
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
String xmlString = result.getWriter().toString();
System.out.println(xmlString);
Примечание: Результаты могут варьироваться в зависимости от версии Java. Поиск обходных решений, характерных для Вашей платформы.
Я обнаружил, что в Java 1.6.0_32 нормальный метод для симпатичной печати строки XML (с использованием Transformer с нулевым или тождественным xslt) не ведет себя так, как я например, если теги просто разделены пробелами, в отличие от отсутствия разделительного текста. Я попытался использовать <xsl:strip-space elements="*"/>
в моем шаблоне безрезультатно. Самым простым решением, которое я нашел, было освободить пространство так, как я хотел, используя SAXSource и XML-фильтр. Так как мое решение было для регистрации, я также расширил это для работы с неполными фрагментами XML. Обратите внимание, что обычный метод работает нормально, если вы используете DOMSource, но я не хотел использовать его из-за неполноты и нехватки памяти.
public static class WhitespaceIgnoreFilter extends XMLFilterImpl
{
@Override
public void ignorableWhitespace(char[] arg0,
int arg1,
int arg2) throws SAXException
{
//Ignore it then...
}
@Override
public void characters( char[] ch,
int start,
int length) throws SAXException
{
if (!new String(ch, start, length).trim().equals(""))
super.characters(ch, start, length);
}
}
public static String prettyXML(String logMsg, boolean allowBadlyFormedFragments) throws SAXException, IOException, TransformerException
{
TransformerFactory transFactory = TransformerFactory.newInstance();
transFactory.setAttribute("indent-number", new Integer(2));
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StringWriter out = new StringWriter();
XMLReader masterParser = SAXHelper.getSAXParser(true);
XMLFilter parser = new WhitespaceIgnoreFilter();
parser.setParent(masterParser);
if(allowBadlyFormedFragments)
{
transformer.setErrorListener(new ErrorListener()
{
@Override
public void warning(TransformerException exception) throws TransformerException
{
}
@Override
public void fatalError(TransformerException exception) throws TransformerException
{
}
@Override
public void error(TransformerException exception) throws TransformerException
{
}
});
}
try
{
transformer.transform(new SAXSource(parser, new InputSource(new StringReader(logMsg))), new StreamResult(out));
}
catch (TransformerException e)
{
if(e.getCause() != null && e.getCause() instanceof SAXParseException)
{
if(!allowBadlyFormedFragments || !"XML document structures must start and end within the same entity.".equals(e.getCause().getMessage()))
{
throw e;
}
}
else
{
throw e;
}
}
out.flush();
return out.toString();
}
существует очень хорошая командная строка xml утилита, названная xmlstarlet ( http://xmlstar.sourceforge.net/ ), который может сделать много вещей, которые использует много людей.
Ваш мог выполнить эту программу программно с помощью Runtime.exec и затем читая файл отформатированного вывода. Это имеет больше опций и лучшего сообщения об ошибке, чем несколько строк кода Java могут обеспечить.
загрузка xmlstarlet: http://sourceforge.net/project/showfiles.php?group_id=66612&package_id=64589
Вот способ сделать это, используя dom4j :
Импорт:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
Код:
String xml = "<your xml='here'/>";
Document doc = DocumentHelper.parseText(xml);
StringWriter sw = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter(sw, format);
xw.write(doc);
String result = sw.toString();
<?xml version...
на одной строке и всем остальном на другой строке.
– sixtyfootersdude
04.02.2012, 09:39
Использование jdom2: http://www.jdom.org/
import java.io.StringReader;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
String prettyXml = new XMLOutputter(Format.getPrettyFormat()).
outputString(new SAXBuilder().build(new StringReader(uglyXml)));
Относительно комментария, что "необходимо сначала создать дерево DOM": Нет, Вы нуждаетесь не и не должны делать этого.
Вместо этого создайте StreamSource (новый StreamSource (новый StringReader (ул.)), и канал, который к преобразователю идентификационных данных упомянул. Это будет использовать синтаксический анализатор SAX, и результат будет намного быстрее. Создание промежуточного дерева чисто служебный для этого случая. Иначе находящийся на вершине рейтинга ответ хорош.
Поскольку вы начинаете с String
, вам необходимо перейти к объекту DOM
(например, Node
), прежде чем вы сможете использовать Transformer
. Однако, если вы знаете, что ваша XML-строка является допустимой, и вы не хотите нести нагрузку на память при разборе строки в DOM, а затем выполнить преобразование через DOM, чтобы получить строку обратно - вы можете просто сделать несколько старомодным посимвольный разбор. Вставьте новую строку и пробелы после каждых </...>
символов, сохраняйте и вставляйте счетчик (для определения количества пробелов), который вы увеличиваете для каждого <...>
и уменьшаете для каждого </...>
, который вы видите.
Отказ от ответственности - я выполнил вырезку / вставку / редактирование текста функций ниже, поэтому они могут не скомпилироваться как есть.
public static final Element createDOM(String strXML)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource sourceXML = new InputSource(new StringReader(strXML))
Document xmlDoc = db.parse(sourceXML);
Element e = xmlDoc.getDocumentElement();
e.normalize();
return e;
}
public static final void prettyPrint(Node xml, OutputStream out)
throws TransformerConfigurationException, TransformerFactoryConfigurationError, TransformerException {
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(xml), new StreamResult(out));
}
Просто для дальнейшего использования, вот решение, которое сработало для меня (благодаря комментарию, который @George Hawkins разместил в одном из ответов):
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
LSOutput output = impl.createLSOutput();
ByteArrayOutputStream out = new ByteArrayOutputStream();
output.setByteStream(out);
writer.write(document, output);
String xmlStr = new String(out.toByteArray());
Хммм ... сталкивался с чем-то вроде этого, и это известная ошибка ... просто добавьте этот OutputProperty ..
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "8");
Надеюсь, это поможет ...
немного улучшенная версия от милосмн ...
public static String getPrettyXml(String xml) {
if (xml == null || xml.trim().length() == 0) return "";
int stack = 0;
StringBuilder pretty = new StringBuilder();
String[] rows = xml.trim().replaceAll(">", ">\n").replaceAll("<", "\n<").split("\n");
for (int i = 0; i < rows.length; i++) {
if (rows[i] == null || rows[i].trim().length() == 0) continue;
String row = rows[i].trim();
if (row.startsWith("<?")) {
pretty.append(row + "\n");
} else if (row.startsWith("</")) {
String indent = repeatString(--stack);
pretty.append(indent + row + "\n");
} else if (row.startsWith("<") && row.endsWith("/>") == false) {
String indent = repeatString(stack++);
pretty.append(indent + row + "\n");
if (row.endsWith("]]>")) stack--;
} else {
String indent = repeatString(stack);
pretty.append(indent + row + "\n");
}
}
return pretty.toString().trim();
}
private static String repeatString(int stack) {
StringBuilder indent = new StringBuilder();
for (int i = 0; i < stack; i++) {
indent.append(" ");
}
return indent.toString();
}
createuser
утилита командной строки вместо того, чтобы создать пользователя с SQL. Это имеет опции сделать пользователя администратором. Кроме того, если это говорит Вам, что база данных не существует, тогда вход в систему был успешен. По умолчанию, пост-ГРЭС пытается войти в систему к user' s " home" база данных, которая имела бы то же имя как пользователь. Любой создает " puser" база данных или попытка psql -U puser myapp
для входа в систему к " myapp".
– cecilkorik
30.10.2019, 21:38
Вот ответ на мой собственный вопрос. Я объединил ответы из различных результатов, чтобы написать класс, который прекрасно печатает XML.
Нет гарантий того, как он отвечает недействительным XML или большими документами.
package ecb.sdw.pretty;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
/**
* Pretty-prints xml, supplied as a string.
* <p/>
* eg.
* <code>
* String formattedXml = new XmlFormatter().format("<tag><nested>hello</nested></tag>");
* </code>
*/
public class XmlFormatter {
public XmlFormatter() {
}
public String format(String unformattedXml) {
try {
final Document document = parseXmlFile(unformattedXml);
OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);
return out.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private Document parseXmlFile(String in) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(in));
return db.parse(is);
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
String unformattedXml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><QueryMessage\n" +
" xmlns=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message\"\n" +
" xmlns:query=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/query\">\n" +
" <Query>\n" +
" <query:CategorySchemeWhere>\n" +
" \t\t\t\t\t <query:AgencyID>ECB\n\n\n\n</query:AgencyID>\n" +
" </query:CategorySchemeWhere>\n" +
" </Query>\n\n\n\n\n" +
"</QueryMessage>";
System.out.println(new XmlFormatter().format(unformattedXml));
}
}
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
после LSSerializer writer = ...
строка.
– George Hawkins
04.05.2011, 22:43
document
была инициализирована, таким образом, я думал, что мог бы добавить в замедлении и сделать быстрый пример из него. Сообщите мне, должен ли я изменить что-то, pastebin.com/XL7932aC
– samwell
17.07.2012, 06:52
В прошлом я довольно печатал, используя метод org.dom4j.io.OutputFormat.createPrettyPrint ()
public String prettyPrint(final String xml){
if (StringUtils.isBlank(xml)) {
throw new RuntimeException("xml was null or blank in prettyPrint()");
}
final StringWriter sw;
try {
final OutputFormat format = OutputFormat.createPrettyPrint();
final org.dom4j.Document document = DocumentHelper.parseText(xml);
sw = new StringWriter();
final XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
}
catch (Exception e) {
throw new RuntimeException("Error pretty printing xml:\n" + xml, e);
}
return sw.toString();
}
более простое решение на основе этого ответа :
public static String prettyFormat(String input, int indent) {
try {
Source xmlInput = new StreamSource(new StringReader(input));
StringWriter stringWriter = new StringWriter();
StreamResult xmlOutput = new StreamResult(stringWriter);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setAttribute("indent-number", indent);
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
return xmlOutput.getWriter().toString();
} catch (Exception e) {
throw new RuntimeException(e); // simple exception handling, please review it
}
}
public static String prettyFormat(String input) {
return prettyFormat(input, 2);
}
контрольный пример:
prettyFormat("<root><child>aaa</child><child/></root>");
возвращает:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>aaa</child>
<child/>
</root>
factory.setAttribute("indent-number", 4);
, и теперь она работает.
– Adrian Smith
22.10.2010, 03:25
<?xml version="1.0" encoding="UTF-8"?>
?
– Thang Pham
20.07.2011, 09:13
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
– jjmontes
07.10.2011, 23:06
combine_first
- использование его для объединения трех кадров данных некоторых 30k строк, каждый настигает всю мою память. Какой-либо путь вокруг этого?
– scry
30.12.2019, 07:12
<?xml version="1.0" encoding="UTF-8"?>
? – Thang Pham 20.07.2011, 09:26