Java трансформер w3c.dom.document для inputtream
Мой сценарий таков:
У меня есть HTML-код, который я загрузил в w3c.dom.Document, после загрузки его в качестве документа, я проанализировал его узлы и сделал несколько изменений в их значениях, но теперь мне нужно преобразовать этот документ в строку, или желательно в InputStream напрямую.
И мне удалось сделать это, однако, до конца мне нужен этот HTML, он должен сохранять некоторые свойства исходного файла, например (и это одна вещь, которую я изо всех сил пытаюсь решить), все теги должны быть закрыто.
Скажем, у меня есть тег ссылки в заголовке, <link .... />
Мне нужна черта (/) в конце. Однако после того, как преобразователь преобразовал мой документ в outputStream (который затем я продолжаю посылать в inputStream), все "/" перед> исчезают. Все мои теги, которые закончились />
превращаются в простые >
,
Причина, по которой мне нужна эта структура, заключается в том, что одна из библиотек, которую я использую (и я боюсь, что я не могу искать другую, особенно не в данный момент), требует, чтобы все теги были закрыты, если нет, она выдает исключения везде и моя программа вылетает....
У кого-нибудь есть какие-нибудь хорошие идеи или решения для меня? Это мой первый контакт с классом Transform, поэтому я могу упустить что-то, что может мне помочь.
Спасибо вам всем большое,
Теплые пожелания
Немного кода, чтобы немного объяснить сценарий
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
org.w3c.dom.Document doc = docBuilder.parse(his); // his = the HTML inputStream
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "//*[@id='pessoaNome']";
org.w3c.dom.Element pessoaNome = null;
try
{
pessoaNome = (org.w3c.dom.Element) (Node) xPath.compile(expression).evaluate(doc, XPathConstants.NODE);
}
catch (Exception e)
{
e.printStackTrace();
}
pessoaNome.setTextContext("The new values for the node");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Source xmlSource = new DOMSource(doc);
Result outputTarget = new StreamResult(outputStream);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "HTML");
transformer.transform(xmlSource, outputTarget);
InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); // At this point outputStream is already all messed up, not just the '/'. but this is the only thing causing me problems
как указал @Lee, я изменил его, чтобы использовать Jsoup. Код стал намного чище, просто нужно было настроить выходные параметры, чтобы он работал как шарм. Код ниже
org.jsoup.nodes.Document doc = Jsoup.parse(new File(HTML), "UTF-8");
org.jsoup.nodes.Element pessoaNome = doc.getElementById("pessoaNome");
pessoaNome.html("My new html in here");
OutputSettings oSettings = new OutputSettings();
oSettings.syntax(org.jsoup.nodes.Document.OutputSettings.Syntax.xml);
doc.outputSettings(oSettings);
InputStream is = new ByteArrayInputStream(doc.outerHtml().getBytes());