広告

Java : Entity (XML) - API使用例

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


概要

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

クラス構成

関連記事: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 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
}

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。

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

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

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
}

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


関連記事

ページの先頭へ