Java : CharacterData (XML) - API使用例

CharacterData (Java SE 17 & JDK 17) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

CharacterDataインタフェースは、属性とメソッドのセットを追加してNodeを拡張することにより、DOM内の文字データにアクセスできるようにします。

クラス構成

CharacterDataインタフェースは、XMLノードである TextComment のベースとなるインタフェースです。

関連記事:XML (DOM) の基本

共通で使うコード

本記事のAPI使用例では、利便性のために以下のメソッドを共通処理として使います。

// DocumentをXMLでコンソールに出力します。
// 見やすくするために<?xml ~ ?>は非表示にしています。
public void printDocument(Node node) 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(node), result);

    System.out.println(result.getWriter());
}
final var xml = """
        <root>abcd</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcd]

    characterData.setData("XYZ");

    // <root>XYZ</root>
    printDocument(root);
}

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

メソッド

void appendData (String arg)

ノードの文字データの末尾に文字列を追加します。

printDocumentメソッドについてはこちらをご参照ください。

final var xml = """
        <root>abcd</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcd]

    characterData.appendData("XYZ");

    // <root>abcdXYZ</root>
    printDocument(root);
}

void deleteData (int offset, int count)

ノードから指定範囲の16ビット単位を削除します。

printDocumentメソッドについてはこちらをご参照ください。

final var xml = """
        <root>abcdXYZ</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcdXYZ]

    characterData.deleteData(0, 4);

    // <root>XYZ</root>
    printDocument(root);

    characterData.deleteData(1, 2);

    // <root>X</root>
    printDocument(root);
}

String getData ()

このインタフェースを実装するノードの文字データです。

final var xml = """
        <root>abcd</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcd]
    System.out.println(characterData.getData()); // abcd
    System.out.println(characterData.getLength()); // 4
}

int getLength ()

次のdataメソッドおよびsubstringDataメソッドを介して利用可能な16ビット単位の数。

このメソッドの使用例は、getData() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void insertData (int offset, String arg)

指定された16ビット単位のオフセットに文字列を挿入します。

printDocumentメソッドについてはこちらをご参照ください。

final var xml = """
        <root>XYZ</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: XYZ]

    characterData.insertData(0, "abcd");

    // <root>abcdXYZ</root>
    printDocument(root);

    characterData.insertData(4, "123");

    // <root>abcd123XYZ</root>
    printDocument(root);
}

void replaceData (int offset, int count, String arg)

指定された文字列で、指定された16ビット単位のオフセット以降の文字を置き換えます。

printDocumentメソッドについてはこちらをご参照ください。

final var xml = """
        <root>012345</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: 012345]

    characterData.replaceData(0, 2, "abcd");

    // <root>abcd2345</root>
    printDocument(root);
}
final var xml = """
        <root>012345</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: 012345]

    characterData.replaceData(4, 2, "XYZ");

    // <root>0123XYZ</root>
    printDocument(root);
}

void setData (String data)

このインタフェースを実装するノードの文字データです。

printDocumentメソッドについてはこちらをご参照ください。

final var xml = """
        <root>abcd</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcd]

    characterData.setData("XYZ");

    // <root>XYZ</root>
    printDocument(document);
}

String substringData (int offset, int count)

ノードから所定のデータ範囲を抽出します。

final var xml = """
        <root>abcd</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 CharacterData characterData) {
    System.out.println(characterData); // [#text: abcd]

    System.out.println(characterData.getData()); // abcd

    System.out.println(characterData.substringData(0, 1)); // a
    System.out.println(characterData.substringData(0, 2)); // ab
    System.out.println(characterData.substringData(0, 3)); // abc
    System.out.println(characterData.substringData(0, 4)); // abcd

    System.out.println(characterData.substringData(1, 3)); // bcd
    System.out.println(characterData.substringData(2, 2)); // cd
    System.out.println(characterData.substringData(3, 1)); // d
}

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


関連記事

ページの先頭へ