org.w3c.dom을 로드하려면 어떻게 해야 하나요?XML에서 문자열로 문서를 작성하시겠습니까?
문자열에 완전한 XML 문서가 있으며 다음 문서를 원합니다.Document
물건.구글은 모든 종류의 쓰레기를 찾아낸다.가장 간단한 해결책은 무엇입니까?(Java 1.5의 경우)
솔루션 Matt McMinn 덕분에 저는 이 구현을 결정했습니다.입력의 유연성과 예외적인 세밀함을 갖추고 있습니다.(오류가 잘못된 형식의 XML에서 비롯되었는지 확인하는 것이 좋습니다.SAXException
- 또는 단순히 잘못된 IO -IOException
.)
public static org.w3c.dom.Document loadXMLFrom(String xml)
throws org.xml.sax.SAXException, java.io.IOException {
return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}
public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is)
throws org.xml.sax.SAXException, java.io.IOException {
javax.xml.parsers.DocumentBuilderFactory factory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
javax.xml.parsers.DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
}
catch (javax.xml.parsers.ParserConfigurationException ex) {
}
org.w3c.dom.Document doc = builder.parse(is);
is.close();
return doc;
}
와!
이 코드에는 심각한 문제가 있을 수 있습니다.이것은, 에 지정된 문자 인코딩을 무시하기 때문입니다.String
(디폴트로는 UTF-8).전화할 때String.getBytes()
플랫폼의 디폴트 부호화는 Unicode 문자를 바이트로 인코딩하기 위해 사용됩니다.따라서 파서는 실제로 EBCDIC 같은 데이터를 수신하고 있을 때 UTF-8 데이터를 수신하고 있다고 생각할 수 있습니다.예쁘지 않습니다!
대신 다음과 같이 Reader를 사용하여 구성할 수 있는 InputSource를 사용하는 구문 분석 방법을 사용합니다.
import java.io.StringReader;
import org.xml.sax.InputSource;
…
return builder.parse(new InputSource(new StringReader(xml)));
별것 아닌 것처럼 보이지만 문자 부호화 문제에 대한 무지함은 y2k와 유사한 음흉한 코드 부패로 이어집니다.
Java 1.5에서는 이 기능을 사용할 수 있습니다.가독성을 위해 특정 예외를 삭제했습니다.
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
public Document loadXMLFromString(String xml) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}
비슷한 문제가 있었습니다만, 문서가 아니라 NodeList가 필요했습니다.제 생각은 이렇습니다.이 솔루션은 대부분 이전과 동일한 솔루션으로 루트 요소를 NodeList로 만들고 문자 인코딩 문제에 대해 입력 소스를 사용하는 에릭슨의 제안을 사용합니다.
private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);
public static Document loadXMLFrom(String xml) throws Exception {
InputSource is= new InputSource(new StringReader(xml));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
return doc;
}
Java에서 XML을 조작하려면 항상 Transformer API를 사용합니다.
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
public static Document loadXMLFrom(String xml) throws TransformerException {
Source source = new StreamSource(new StringReader(xml));
DOMResult result = new DOMResult();
TransformerFactory.newInstance().newTransformer().transform(source , result);
return (Document) result.getNode();
}
언급URL : https://stackoverflow.com/questions/33262/how-do-i-load-an-org-w3c-dom-document-from-xml-in-a-string
'programing' 카테고리의 다른 글
Arrays.asList()에 의해 작성된 목록의 remove()가 UnsupportedOperation을 슬로우합니다.예외. (0) | 2023.01.17 |
---|---|
Spring Data REST에 @OneToMany 서브 리소스 연결 게시 (0) | 2023.01.17 |
yaml: 행 8: 예상된 키를 찾을 수 없습니다. (0) | 2023.01.17 |
Python의 무한대 해시에 ?자리가 있는 이유는 무엇입니까? (0) | 2023.01.17 |
대소문자를 구분하지 않는 어레이 검색 (0) | 2023.01.17 |