Java : Entity (XML) - API使用例

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


概要

このインタフェースは、XML文書内の解析対象または解析対象外の既知のエンティティを表します。 このインタフェースによってモデル化されるのは、エンティティ宣言ではなくエンティティ自体です。

クラス構成

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

// 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 path = Path.of("R:", "java-work", "xxx");
System.out.println(path); // R:\java-work\xxx

Files.writeString(path, "yyy");

final var xml = """
        <!DOCTYPE root [
            <!ENTITY aaa "bbb">
            <!ENTITY xxx SYSTEM "file:///R:/java-work/xxx">
        ]>
        <root>
          &aaa;
          &xxx;
        </root>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

//<root>
//  bbb
//  yyy
//</root>
printDocument(document);

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getSystemId()); // null
}

if (entities.getNamedItem("xxx") instanceof Entity entity) {
    System.out.println(entity); // [xxx: null]
    System.out.println(entity.getSystemId()); // file:///R:/java-work/xxx
}

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

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

エンティティが外部解析対象エンティティである場合は、解析時にこのエンティティに使用されるエンコーディングを指定する属性。

final var path = Path.of("R:", "java-work", "xxx");
System.out.println(path); // R:\java-work\xxx

Files.writeString(path, "yyy");

final var xml = """
        <!DOCTYPE root [
            <!ENTITY aaa "bbb">
            <!ENTITY xxx SYSTEM "file:///R:/java-work/xxx">
        ]>
        <root>
          &aaa;
          &xxx;
        </root>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

//<root>
//  bbb
//  yyy
//</root>
printDocument(document);

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getInputEncoding()); // null
    System.out.println(entity.getSystemId()); // null
}

if (entities.getNamedItem("xxx") instanceof Entity entity) {
    System.out.println(entity); // [xxx: null]
    System.out.println(entity.getInputEncoding()); // UTF-8
    System.out.println(entity.getSystemId()); // file:///R:/java-work/xxx
}

String getNotationName ()

解析対象外エンティティの場合はエンティティの表記法の名前。

final var xml = """
        <!DOCTYPE root [
            <!ENTITY aaa SYSTEM "bbb" NDATA ccc>
        ]>
        <root/>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getSystemId()); // bbb
    System.out.println(entity.getNotationName()); // ccc
}

String getPublicId ()

エンティティに関連する公開識別子(指定されている場合)。指定されていない場合はnull。

final var xml = """
        <!DOCTYPE root [
            <!ENTITY aaa PUBLIC "bbb" "ccc">
        ]>
        <root/>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getPublicId()); // bbb
    System.out.println(entity.getSystemId()); // ccc
}

String getSystemId ()

エンティティに関連するシステム識別子(指定されている場合)。指定されていない場合はnull。

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

String getXmlEncoding ()

エンティティが外部解析対象エンティティである場合に、テキスト宣言の一部として、このエンティティのエンコーディングを指定する属性。

final var path = Path.of("R:", "java-work", "xxx");
System.out.println(path); // R:\java-work\xxx

Files.writeString(path, """
        <?xml version="1.0" encoding="UTF-8"?>\
        yyy\
        """);

final var xml = """
        <!DOCTYPE root [
            <!ENTITY aaa "bbb">
            <!ENTITY xxx SYSTEM "file:///R:/java-work/xxx">
        ]>
        <root>
          &aaa;
          &xxx;
        </root>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

//<root>
//  bbb
//  yyy
//</root>
printDocument(document);

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getSystemId()); // null
    System.out.println(entity.getXmlVersion()); // null
    System.out.println(entity.getXmlEncoding()); // null
}

if (entities.getNamedItem("xxx") instanceof Entity entity) {
    System.out.println(entity); // [xxx: null]
    System.out.println(entity.getSystemId()); // file:///R:/java-work/xxx
    System.out.println(entity.getXmlVersion()); // 1.0
    System.out.println(entity.getXmlEncoding()); // UTF-8
}
final var path = Path.of("R:", "java-work", "aaa");
System.out.println(path); // R:\java-work\aaa

Files.writeString(path, """
        <?xml version="1.1" encoding="UTF-16"?>\
        bbb\
        """, StandardCharsets.UTF_16);

final var xml = """
        <?xml version="1.1" encoding="UTF-8"?>
        <!DOCTYPE root [
            <!ENTITY aaa SYSTEM "file:///R:/java-work/aaa">
        ]>
        <root>
          &aaa;
        </root>
        """;

final var factory = DocumentBuilderFactory.newInstance();
final var builder = factory.newDocumentBuilder();
final var document = builder.parse(new ByteArrayInputStream(xml.getBytes()));

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

final var entities = document.getDoctype().getEntities();

if (entities.getNamedItem("aaa") instanceof Entity entity) {
    System.out.println(entity); // [aaa: null]
    System.out.println(entity.getSystemId()); // file:///R:/java-work/aaa
    System.out.println(entity.getXmlVersion()); // 1.1
    System.out.println(entity.getXmlEncoding()); // UTF-16
}

String getXmlVersion ()

エンティティが外部解析対象エンティティである場合に、テキスト宣言の一部として、このエンティティのバージョン番号を指定する属性。

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

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


関連記事

ページの先頭へ