programing

Java에서 문자열 XML 조각을 문서 노드로 변환

goodsources 2023. 9. 23. 22:31
반응형

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

반응형