Java : Text (XML) - API使用例

Text (Java SE 17 & JDK 17) の使用例まとめです。
だいたいのメソッドを網羅済みです。
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) の基本

共通で使うコード

本記事の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 ()

このノードに論理的に隣接するテキスト・ノードである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);

// 隣接する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)

このノードを、指定された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」をご参照ください。


関連記事

ページの先頭へ