Java : Text (XML) - API使用例
Text (Java SE 17 & JDK 17) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Textインタフェースは、XML要素の文字データを表します。
<root>AAA<child>BBB</child>CCC</root>
上記XMLの例では、AAAとBBB、CCCがTextとなります。
TextはNodeツリーの一部となります。Element.getChildNodesなどで取得するNodeには、Textノードも含まれているのでご注意ください。
上記XML例のNodeツリー図です。
final var xml = """
<root>AAA<child>BBB</child>CCC</root>
""";
final var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
final var root = document.getDocumentElement();
System.out.println(root); // [root: null]
final var nodes = root.getChildNodes();
System.out.println("-- nodes --");
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i));
}
// 結果
// ↓
//-- nodes --
//[#text: AAA]
//[child: null]
//[#text: CCC]
関連記事:XML (DOM) の基本
共通で使うコード
本記事のAPI使用例では、利便性のために以下のメソッドを共通処理として使います。
// DocumentをXMLでコンソールに出力します。
// 見やすくするために <?xml ~ ?> は非表示にしています。
public void printDocument(Document document) throws TransformerException {
final var transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
final var result = new StreamResult(new StringWriter());
transformer.transform(new DOMSource(document), result);
System.out.println(result.getWriter());
}
使用例です。
final var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final var document = builder.newDocument();
final var root = document.createElement("root");
System.out.println(root); // [root: null]
document.appendChild(root);
final var text = document.createTextNode("abcd");
System.out.println(text); // [#text: abcd]
root.appendChild(text);
//<root>abcd</root>
printDocument(document);
Nodeで宣言されたフィールド
ATTRIBUTE_NODE, CDATA_SECTION_NODE, COMMENT_NODE, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, DOCUMENT_POSITION_PRECEDING, DOCUMENT_TYPE_NODE, ELEMENT_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE, NOTATION_NODE, PROCESSING_INSTRUCTION_NODE, TEXT_NODE
「Java API 使用例 : Node」をご参照ください。
メソッド
String getWholeText ()
final var xml = """
<root/>
""";
final var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
final var root = document.getDocumentElement();
System.out.println(root);
final var aaa = document.createTextNode("aaa");
System.out.println(aaa); // [#text: aaa]
final var bbb = document.createTextNode("bbb");
System.out.println(bbb); // [#text: bbb]
root.appendChild(aaa);
//<root>aaa</root>
printDocument(document);
// 隣接するTextノードがない状態です。
System.out.println(aaa.getWholeText()); // aaa
System.out.println(bbb.getWholeText()); // bbb
root.appendChild(bbb);
//<root>aaabbb</root>
printDocument(document);
// 隣接するTextノードがある状態です。
System.out.println(aaa.getWholeText()); // aaabbb
System.out.println(bbb.getWholeText()); // aaabbb
boolean isElementContentWhitespace ()
無視できる空白文字は、テキスト(#PCDATA)を 持たないこと を宣言した要素が対象となります。
詳細はAPI仕様もご確認ください。
// child-a, child-b要素は半角スペースを持ちます。
final var xml = """
<!DOCTYPE root [
<!ELEMENT child-a (dummy?)>
<!ELEMENT child-b (#PCDATA)>
]>
<root>
<child-a> </child-a>
<child-b> </child-b>
</root>
""";
final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
builder.setErrorHandler(new DefaultHandler());
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
final var childA = document.getElementsByTagName("child-a").item(0);
System.out.println(childA); // [child-a: null]
if (childA.getFirstChild() instanceof Text text) {
System.out.println(text); // [#text: ]
System.out.println(text.isElementContentWhitespace()); // true
}
final var childB = document.getElementsByTagName("child-b").item(0);
System.out.println(childA); // [child-b: null]
if (childB.getFirstChild() instanceof Text text) {
System.out.println(text); // [#text: ]
System.out.println(text.isElementContentWhitespace()); // false
}
Text replaceWholeText (String content)
final var xml = """
<root>aaa</root>
""";
final var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
final var root = document.getDocumentElement();
System.out.println(root); // [root: null]
if (root.getFirstChild() instanceof Text text) {
System.out.println(text); // [#text: aaa]
//<root>aaa</root>
printDocument(document);
System.out.println(text.replaceWholeText("AAA")); // [#text: AAA]
//<root>AAA</root>
printDocument(document);
root.appendChild(document.createTextNode("BBB"));
//<root>AAABBB</root>
printDocument(document);
System.out.println(text.replaceWholeText("XXX")); // [#text: XXX]
//<root>XXX</root>
printDocument(document);
}
Text splitText (int offset)
final var xml = """
<root>abcde</root>
""";
final var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
final var root = document.getDocumentElement();
System.out.println(root); // [root: null]
if (root.getFirstChild() instanceof Text text) {
System.out.println(text); // [#text: abcde]
System.out.println(text.splitText(2)); // [#text: cde]
}
final var nodes = root.getChildNodes();
System.out.println("-- nodes --");
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i));
}
// 結果
// ↓
//-- nodes --
//[#text: ab]
//[#text: cde]
CharacterDataで宣言されたメソッド
appendData, deleteData, getData, getLength, insertData, replaceData, setData, substringData
「Java API 使用例 : CharacterData」をご参照ください。
Nodeで宣言されたメソッド
appendChild, cloneNode, compareDocumentPosition, getAttributes, getBaseURI, getChildNodes, getFeature, getFirstChild, getLastChild, getLocalName, getNamespaceURI, getNextSibling, getNodeName, getNodeType, getNodeValue, getOwnerDocument, getParentNode, getPrefix, getPreviousSibling, getTextContent, getUserData, hasAttributes, hasChildNodes, insertBefore, isDefaultNamespace, isEqualNode, isSameNode, isSupported, lookupNamespaceURI, lookupPrefix, normalize, removeChild, replaceChild, setNodeValue, setPrefix, setTextContent, setUserData
「Java API 使用例 : Node」をご参照ください。