Trong Java, làm cách nào để phân tích cú pháp XML dưới dạng Chuỗi thay vì tệp?


249

Tôi có đoạn mã sau:

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

Làm cách nào tôi có thể lấy nó để phân tích cú pháp XML có trong Chuỗi thay vì tệp?


7
Cũng lưu ý rằng javax.xml.parsers.DocumentBuilder.parse(string)giả sử chuỗi là một uri (khủng khiếp ...)
Barshe Roussy

Câu trả lời:


479

Tôi có chức năng này trong cơ sở mã của tôi, điều này sẽ làm việc cho bạn.

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);
}

cũng thấy câu hỏi tương tự


3
@shsteimer Tôi đang truyền chuỗi xml và nó trả về null. Nó không ném bất kỳ ngoại lệ. Điều gì phải sai?
sattu

@sattu: Bạn nên đăng nó dưới dạng câu hỏi mới. Thật sự rất khó để nói mà không nhìn thấy mã của bạn.
Alexander Malakhov

cảm ơn nhiều, đã lưu cho tôi rất nhiều dòng mã, tôi đã chuyển đổi nó thành văn bản nhưng tôi biết có một cách tốt hơn!
nkuebelbeck

3
nếu tôi có <? XML> nó trả về một nút trống thì tôi có thể làm gì?
Dejell

1
Kiểm tra xem bạn có sử dụng câu lệnh nhập đúng không:import org.xml.sax.InputSource;
Daniel Eisenreich

18

Một cách là sử dụng phiên bản phân tích cú pháp lấy InputSource chứ không phải là tệp

Một nguồn đầu vào SAX có thể được xây dựng từ một đối tượng Reader. Đối tượng One Reader là StringReader

Vì vậy, một cái gì đó như

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

5

javadocs cho thấy phương thức phân tích cú pháp bị quá tải.

Tạo StringStream hoặc InputSource bằng chuỗi XML của bạn và bạn sẽ được đặt.


4

Chuyển đổi chuỗi thành InputStream và chuyển nó sang DocumentBuilder

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

EDIT
Để trả lời bình luận của uốn cong về mã hóa, hãy xem câu trả lời của shsteimer cho câu hỏi này.


1
Tôi thích StringReader hơn vì nó tránh String.getBytes (), nhưng điều này thường cũng sẽ hoạt động.
Michael Myers

3
Khi bạn gọi getBytes (), bạn muốn sử dụng mã hóa nào? Làm thế nào bạn nói với trình phân tích cú pháp XML mà nó đang nhận được? Bạn có mong đợi nó đoán không? Điều gì xảy ra khi bạn ở trên một nền tảng nơi mã hóa mặc định không phải là UTF-8?
uốn cong

2

Tôi đang sử dụng phương pháp này

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

Bạn có thể sử dụng gói Progession XML của Scilca có sẵn tại GitHub.

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

0

chỉ cần nhập

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.