org.w3c.dom 출력 방법요소에서 문자열 형식(Java)을 선택하십시오.
나는 가지고 있다.org.w3c.dom.Element
오브젝트가 메서드에 전달되었습니다.하위 노드를 포함한 전체 xml 문자열(전체 개체 그래프)을 확인해야 합니다.저는 이 파일을 변환할 수 있는 방법을 찾고 있습니다.Element
xml 형식의 문자열로 변환하여System.out.println
켜요. 그냥println()
Element' 오브젝트는 동작하지 않습니다.toString()
xml 형식을 출력하지 않고 하위 노드를 통과하지 않습니다.저만의 방법을 쓰지 않고 쉽게 할 수 있는 방법이 있을까요?감사해요.
표준 API를 계속 사용한다면...
DOMImplementation을 사용할 수 있습니다.LS:
Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);
<?xml version="1.0" encoding="의 경우UTF-16인치?> 선언은 번거롭습니다.대신 트랜스포머를 사용할 수 있습니다.
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
new StreamResult(buffer));
String str = buffer.toString();
간단한 4행 코드 취득String
xml 변환 없음(<?xml version="1.0" encoding="UTF-16"?>
)부터org.w3c.dom.Element
DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
LSSerializer serializer = lsImpl.createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", false); //by default its true, so set it to false to get String without xml-declaration
String str = serializer.writeToString(node);
jcabi-xml을 1개의 라이너로 시험합니다.
String xml = new XMLDocument(element).toString();
표준 JAXP API에서는 지원되지 않기 때문에 이 목적으로 JDOM 라이브러리를 사용했습니다.프린터 기능, 포메터 옵션 등이 있습니다.http://www.jdom.org/
XML 스키마를 가지고 있거나 XML 스키마를 위해 JAXB 바인딩을 작성할 수 있는 경우 JAXB Marshaller를 사용하여 시스템에 쓸 수 있습니다.출력:
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRootElement
public class BoundClass {
@XmlAttribute
private String test;
@XmlElement
private int x;
public BoundClass() {}
public BoundClass(String test) {
this.test = test;
}
public static void main(String[] args) throws Exception {
JAXBContext jxbc = JAXBContext.newInstance(BoundClass.class);
Marshaller marshaller = jxbc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(new JAXBElement(new QName("root"),BoundClass.class,new Main("test")),System.out);
}
}
jcabi에서는 다음과 같이 동작합니다.
private String asString(Node node) {
StringWriter writer = new StringWriter();
try {
Transformer trans = TransformerFactory.newInstance().newTransformer();
// @checkstyle MultipleStringLiterals (1 line)
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.setOutputProperty(OutputKeys.VERSION, "1.0");
if (!(node instanceof Document)) {
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
}
trans.transform(new DOMSource(node), new StreamResult(writer));
} catch (final TransformerConfigurationException ex) {
throw new IllegalStateException(ex);
} catch (final TransformerException ex) {
throw new IllegalArgumentException(ex);
}
return writer.toString();
}
나한텐 효과가 있어!
VTD-XML을 사용하면 커서로 이동하여 getElementFragment 호출을 1회 실행하여 세그먼트(오프셋 및 길이)를 취득할 수 있습니다.다음은 예시입니다.
import com.ximpleware.*;
public class concatTest{
public static void main(String s1[]) throws Exception {
VTDGen vg= new VTDGen();
String s = "<users><user><firstName>some </firstName><lastName> one</lastName></user></users>";
vg.setDoc(s.getBytes());
vg.parse(false);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/users/user/firstName");
int i=ap.evalXPath();
if (i!=1){
long l= vn.getElementFragment();
System.out.println(" the segment is "+ vn.toString((int)l,(int)(l>>32)));
}
}
}
언급URL : https://stackoverflow.com/questions/1219596/how-to-i-output-org-w3c-dom-element-to-string-format-in-java
'itsource' 카테고리의 다른 글
ER_NOT_SUpported_AUTH_MODE - MySQL 서버 (1) | 2022.10.05 |
---|---|
VueJ에서 속성별 개체 정렬 목록s (0) | 2022.10.05 |
이름을 문자열로 지정한 모듈을 Import하려면 어떻게 해야 합니까? (0) | 2022.10.05 |
MySQL에서 타임스탬프 마이너스 6주를 얻으려면 어떻게 해야 하나요? (0) | 2022.10.05 |
pip 설치가 실패하고 "연결 오류: [SSL: CERTIFICATE_VERIFY_FAILED] 인증서 검증 실패(_ssl.c:598)"가 표시됨 (0) | 2022.10.05 |