Java에서 문자열 XML 조각을 문서 노드로 변환
자바에서 XML 문서에 삽입하기 위한 XML 조각을 나타내는 문자열을 변환하려면 어떻게 해야 합니까?
예.
String newNode = "<node>value</node>"; // Convert this to XML
그런 다음 이 노드를 org.w3c.dom에 삽입합니다.주어진 노드의 자식으로 문서화하시겠습니까?
Element node = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream("<node>value</node>".getBytes()))
.getDocumentElement();
문서의 가져오기(또는 채택) 방법을 사용하여 XML 조각을 추가할 수 있습니다.
/**
* @param docBuilder
* the parser
* @param parent
* node to add fragment to
* @param fragment
* a well formed XML fragment
*/
public static void appendXmlFragment(
DocumentBuilder docBuilder, Node parent,
String fragment) throws IOException, SAXException {
Document doc = parent.getOwnerDocument();
Node fragmentNode = docBuilder.parse(
new InputSource(new StringReader(fragment)))
.getDocumentElement();
fragmentNode = doc.importNode(fragmentNode, true);
parent.appendChild(fragmentNode);
}
제가 dom4j 라이브러리를 사용하여 생각해낸 해결책이 있습니다. (작동하는 것을 확인했습니다.)
로 .org.dom4j.Document
고:든 XML는 org.dom4j입니다). 부록 참조):
String newNode = "<node>value</node>"; // Convert this to XML
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(newNode));
그런 다음 새 노드가 삽입된 Document와 해당 노드에서 상위 요소(대상)를 가져옵니다. (org.w3c.dom.문서를 org.dom4j로 변환해야 합니다.여기에 문서를 작성합니다.)테스트 목적으로 다음과 같은 것을 만들었습니다.
Document originalDoc =
new SAXReader().read(new StringReader("<root><given></given></root>"));
Element givenNode = originalDoc.getRootElement().element("given");
새 하위 요소를 추가하는 작업은 매우 간단합니다.
givenNode.add(newNodeDocument.getRootElement());
중입니다originalDoc
산출량:출:
<?xml version="1.0" encoding="utf-8"?>
<root>
<given>
<node>value</node>
</given>
</root>
부록: 당신의 질문이 다음과 같은 것을 말해주기 때문입니다.org.w3c.dom.Document
와 입니다 사이의 org.dom4j.Document
.
// dom4j -> w3c
DOMWriter writer = new DOMWriter();
org.w3c.dom.Document w3cDoc = writer.write(dom4jDoc);
// w3c -> dom4j
DOMReader reader = new DOMReader();
Document dom4jDoc = reader.read(w3cDoc);
(하다면)Document
으로, , "라고에서"이라고 .XMLUtils
뭐 그런 거.)
타사 라이브러리가 없어도 더 나은 방법이 있을 수 있습니다.하지만 지금까지 제시된 솔루션 중에서 dom4j <-> w3c 변환을 해야 하는 경우에도 가장 쉬운 방법이라고 생각합니다.
업데이트(2011): 코드에 dom4j 종속성을 추가하기 전에 적극적으로 유지되는 프로젝트가 아니며 다른 문제도 있습니다.개선된 버전 2.0은 오래 전부터 개발 중이지만 알파 버전만 있습니다.대신 XOM과 같은 대안을 고려해 볼 수도 있습니다. 위에 링크된 질문에서 자세히 읽어 보십시오.
여기 내 dom4j 답변과 경쟁하는 XOM 라이브러리를 사용하는 또 다른 솔루션이 있습니다. (이것은 XOM이 하나의 옵션으로 제안된 좋은 dom4j 대체품을 찾기 위한 내 탐색의 일부입니다.)
을 조각 를 로로 들입니다.nu.xom.Document
:
String newNode = "<node>value</node>"; // Convert this to XML
Document newNodeDocument = new Builder().build(newNode, "");
그런 다음 Document와 fragment가 추가된 Node를 가져옵니다.다시 한번 테스트를 위해 문자열로 문서를 만듭니다.
Document originalDoc = new Builder().build("<root><given></given></root>", "");
Element givenNode = originalDoc.getRootElement().getFirstChildElement("given");
를 추가하는단, 은 dom4j 합니다(을 들어 XOM )에 할 수 ).newNodeDocument
):
givenNode.appendChild(newNodeDocument.getRootElement().copy());
문서를 출력하면 올바른 결과 XML이 생성됩니다(XOM에서는 매우 쉽습니다). 반환되는 문자열만 인쇄하면 됩니다.originalDoc.toXML()
):
<?xml version="1.0"?>
<root><given><node>value</node></given></root>
(If you wanted to format the XML nicely (with indentations and linefeeds), use a Serializer
; thanks to Peter Štibraný for pointing this out.)
So, admittedly this isn't very different from the dom4j solution. :) However, XOM may be a little nicer to work with, because the API is better documented, and because of its design philosophy that there's one canonical way for doing each thing.
부록: 다시, 다음은 다음과 같이 변환하는 방법입니다.org.w3c.dom.Document
그리고.nu.xom.Document
. XOM의 도우미 메소드 사용DOMConverter
클래스:
// w3c -> xom
Document xomDoc = DOMConverter.convert(w3cDoc);
// xom -> w3c
org.w3c.dom.Document w3cDoc = DOMConverter.convert(xomDoc, domImplementation);
// You can get a DOMImplementation instance e.g. from DOMImplementationRegistry
/**
*
* Convert a string to a Document Object
*
* @param xml The xml to convert
* @return A document Object
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public static Document string2Document(String xml) throws IOException, SAXException, ParserConfigurationException {
if (xml == null)
return null;
return inputStream2Document(new ByteArrayInputStream(xml.getBytes()));
}
/**
* Convert an inputStream to a Document Object
* @param inputStream The inputstream to convert
* @return a Document Object
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public static Document inputStream2Document(InputStream inputStream) throws IOException, SAXException, ParserConfigurationException {
DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();
newInstance.setNamespaceAware(true);
Document parse = newInstance.newDocumentBuilder().parse(inputStream);
return parse;
}
If you're using dom4j, you can just do:
Document document = DocumentHelper.parseText(text);
(dom4j now found here: https://github.com/dom4j/dom4j)
...and if you're using purely XOM, something like this:
String xml = "<fakeRoot>" + xml + "</fakeRoot>";
Document doc = new Builder( false ).build( xml, null );
Nodes children = doc.getRootElement().removeChildren();
for( int ix = 0; ix < children.size(); ix++ ) {
otherDocumentElement.appendChild( children.get( ix ) );
}
XOM uses fakeRoot internally to do pretty much the same, so it should be safe, if not exactly elegant.
Try jcabi-xml, with a one liner:
Node node = new XMLDocument("<node>value</node>").node();
ReferenceURL : https://stackoverflow.com/questions/729621/convert-string-xml-fragment-to-document-node-in-java
'programing' 카테고리의 다른 글
JS/jQuery가 HTTP 요청 요청 헤더를 얻습니까? (0) | 2023.09.23 |
---|---|
Oracle driver를 통해 Nodejs로 원격 Oracle DB에 연결 (0) | 2023.09.23 |
copy-item With Alternate Credentials (0) | 2023.09.18 |
(설명을 사용하지 않고) 소유하지 않은 오라클 테이블에서 칼럼 정보를 가져오는 방법? (0) | 2023.09.18 |
12시간 hh:mm AM/PM을 24시간 hh:mm로 변환 (0) | 2023.09.18 |