ใน Java ฉันจะแยกวิเคราะห์ XML เป็นสตริงแทนไฟล์ได้อย่างไร


249

ฉันมีรหัสต่อไปนี้:

DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);

ฉันจะให้มันแยกวิเคราะห์ XML ที่มีอยู่ใน String แทนที่จะเป็นไฟล์ได้อย่างไร


7
นอกจากนี้โปรดทราบว่าjavax.xml.parsers.DocumentBuilder.parse(string)สมมติว่าสตริงนั้นเป็น uri (แย่มาก ... )
Christophe Roussy

คำตอบ:


479

ฉันมีฟังก์ชั่นนี้ในรหัสฐานของฉันมันควรจะทำงานให้คุณ

public static Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(xml));
    return builder.parse(is);
}

ดูคำถามที่คล้ายกันนี้ด้วย


3
@shsteimer ฉันส่งผ่านสตริง xml และส่งคืน null มันไม่ได้โยนข้อยกเว้นใด ๆ จะต้องมีอะไรผิดปกติ?
sattu

@sattu: คุณควรโพสต์เป็นคำถามใหม่ เป็นการยากที่จะบอกโดยไม่เห็นรหัสของคุณ
Alexander Malakhov

ขอบคุณมากบันทึกรหัสมัดฉันไว้ฉันแปลงมันกลับเป็นข้อความ แต่ฉันรู้ว่ามันมีวิธีที่ดีกว่า!
nkuebelbeck

3
หากฉันมี <? XML> มันจะส่งคืนโหนดว่างเปล่าฉันควรทำอย่างไร
เดเจล

1
ตรวจสอบว่าคุณใช้คำสั่งการนำเข้าที่ถูกต้อง:import org.xml.sax.InputSource;
Daniel Eisenreich

18

วิธีหนึ่งคือการใช้รุ่นของการแยกวิเคราะห์ที่ใช้ InputSource แทนที่จะเป็นไฟล์

SAX InputSource สามารถสร้างขึ้นจากวัตถุ Reader วัตถุตัวอ่านหนึ่งคือ StringReader

ดังนั้นสิ่งที่ชอบ

parse(new InputSource(new StringReader(myString))) may work. 

5

javadocsแสดงให้เห็นว่าวิธีการแยกวิเคราะห์เป็นมากเกินไป

สร้าง StringStream หรือ InputSource โดยใช้สตริง XML ของคุณและคุณควรตั้งค่า


4

แปลงสตริงเป็น InputStream และส่งผ่านไปยัง DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

แก้ไข
เพื่อตอบสนองต่อความคิดเห็นของbendinเกี่ยวกับการเข้ารหัสดูคำตอบของshsteimerสำหรับคำถามนี้


1
ฉันชอบ StringReader เพราะหลีกเลี่ยง String.getBytes () แต่โดยปกติแล้วก็ควรใช้
Michael Myers

3
เมื่อคุณเรียกใช้ getBytes () คุณคาดว่าจะใช้การเข้ารหัสอะไร คุณจะบอกตัวแยกวิเคราะห์ XML ที่กำลังเข้ารหัสอยู่ได้อย่างไร คุณคาดหวังให้เดาได้ไหม จะเกิดอะไรขึ้นเมื่อคุณอยู่บนแพลตฟอร์มที่การเข้ารหัสเริ่มต้นไม่ใช่ UTF-8
bendin

2

ฉันใช้วิธีนี้

public Document parseXmlFromString(String xmlString){
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream = new    ByteArrayInputStream(xmlString.getBytes());
    org.w3c.dom.Document document = builder.parse(inputStream);
    return document;
}

0

คุณสามารถใช้แพ็คเกจ Scilca XML Progession ได้ที่ GitHub

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();

0

ใส่เพียง

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.