広告

Java : Text (XML) - API使用例

Text (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
API仕様書のおともにどうぞ。


概要

TextインタフェースはCharacterDataを継承し、ElementまたはAttrのテキスト形式の内容(XMLでは文字データという)を表します。

クラス構成

Textインタフェースは、XML要素の文字データを表します。

<root>AAA<child>BBB</child>CCC</root>

上記 XML の例では、AAABBBCCC が 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) の基本操作

本記事のコード例では、利便性のために以下の printDocument メソッドを使います。

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 ()

このノードに論理的に隣接するテキスト・ノードであるTextノードのすべてのテキストを文書の順に連結して返します。

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

System.out.println(aaa.getWholeText()); // aaa
System.out.println(bbb.getWholeText()); // bbb

root.appendChild(bbb);

//<root>aaabbb</root>
printDocument(document);

System.out.println(aaa.getWholeText()); // aaabbb
System.out.println(bbb.getWholeText()); // aaabbb

boolean isElementContentWhitespace ()

このテキスト・ノードが要素コンテンツ空白文字 (多くの場合、「無視できる空白文字」と呼ばれる)を含むかどうかを返します。

無視できる空白文字は、テキスト(#PCDATA) を 持たないこと を宣言した要素が対象となります。
詳細は API仕様もご確認ください。

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)

このノードを、指定されたoffset位置で2つのノードに分割し、それらを兄弟ノードとしてツリー内に保存します。

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」をご参照ください。


関連記事

ページの先頭へ