Javaでは、XMLをファイルではなく文字列として解析するにはどうすればよいですか?


249

私は次のコードを持っています:

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

ファイルではなく文字列に含まれるXMLを解析するにはどうすればよいですか?


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 2013年

@sattu:新しい質問として投稿してください。あなたのコードを見ずに見分けるのは本当に難しいです。
Alexander Malakhov 2013

おかげで、たくさんのコード行を節約できました。それをテキストに戻していましたが、もっと良い方法があることはわかっていました。
nkuebelbeck 2013

3
<?XML>がある場合、空のノードを返します。
Dejell 2014年

1
正しいインポート文を使用していることを確認してください:import org.xml.sax.InputSource;
Daniel Eisenreich

18

1つの方法は、ファイルではなくInputSourceを使用するバージョンの解析を使用することです

SAX InputSourceは、Readerオブジェクトから構築できます。1つのReaderオブジェクトはStringReaderです

だからのようなもの

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

5

javadocsは、解析メソッドがオーバーロードされていることを示しています。

文字列XMLを使用してStringStreamまたはInputSourceを作成すると、設定する必要があります。


4

文字列をInputStreamに変換し、DocumentBuilderに渡します

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

編集エンコーディングに関するベンディンのコメントに
応じて、この質問に対するシュタイマーの回答を参照してください。


1
StringReaderの方がString.getBytes()を回避できるため、私はStringReaderを選択しますが、これも通常は機能するはずです。
マイケル・マイヤーズ

3
getBytes()を呼び出すとき、どのエンコーディングを使用する予定ですか?取得しているエンコーディングをXMLパーサーにどのように伝えていますか?推測すると思いますか?デフォルトのエンコーディングがUTF-8ではないプラットフォームを使用している場合はどうなりますか?
ベンディン2009

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

GitHubで入手可能なScilca XML Progessionパッケージを使用できます。

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.