Поскольку вы начинаете с 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));
}
char
может быть подписанный или неподписанный - это зависит от реализации. Вы видите эти результаты, потому что char
подписан по умолчанию в вашем компиляторе.
Для подписанного char 0xFF соответствует -1 (так работает дополнение до двух). Когда вы пытаетесь сдвинуть его, он сначала превращается в int
, а затем сдвигается - вы фактически получаете умножение на 256.
Итак, это такой код:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
Когда я впервые взглянул на проблему, мое первоначальное мнение заключалось в том, что символ 'c' следует сдвинуть влево на 8 бит - все 8 бит будут отброшены, тогда пустой символ будет преобразован в int со значением 0.
Небольшое исследование показывает Обычные унарные преобразования - именно здесь, чтобы уменьшить большое количество арифметических типов, преобразования применяются автоматически к операндам унарных '!', '- Операторы ',' ~ 'и' * ', и для каждого из операндов двоичных операторов' << 'и' >> '.
Поэтому символ' c 'преобразуется в int сначала , затем сдвинулся влево, дав ответ, который вы видите.
Вы узнаете что-то новое каждый день!
char - это не что иное, как символ со знаком. Таким образом, char c = 0xFF будет -1. Если оставить сдвиг -1 на 8 бит, получится -256.
c повышается до int перед выполнением операции сдвига. Предполагая, что в вашей реализации символы подписаны по умолчанию, это означает, что вы получите 0xffffffff, который затем сдвинется влево, чтобы получить результат.
Если вы превратите c в символ без знака, вы должны получить то, что ожидаете.