import javax.xml.parsers.*;
public class XmlFactoryHolder {
private static final DocumentBuilderFactory FACTORY;
static {
FACTORY = DocumentBuilderFactory.newInstance();
try {
// 安全設定(防 XXE)
FACTORY.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
FACTORY.setFeature("http://xml.org/sax/features/external-general-entities", false);
FACTORY.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
FACTORY.setXIncludeAware(false);
FACTORY.setExpandEntityReferences(false);
} catch (Exception e) {
throw new RuntimeException("XML Factory init failed", e);
}
}
public static DocumentBuilder newBuilder() {
try {
return FACTORY.newDocumentBuilder(); // 每次要新的 builder
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
aW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CgoKCnB1YmxpYyBjbGFzcyBYbWxGYWN0b3J5SG9sZGVyIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IEZBQ1RPUlk7CgoKCiAgICBzdGF0aWMgewoKICAgICAgICBGQUNUT1JZID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwoKICAgICAgICB0cnkgewoKICAgICAgICAgICAgLy8g5a6J5YWo6Kit5a6a77yI6ZiyIFhYRe+8iQoKICAgICAgICAgICAgRkFDVE9SWS5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZGlzYWxsb3ctZG9jdHlwZS1kZWNsIiwgdHJ1ZSk7CgogICAgICAgICAgICBGQUNUT1JZLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzIiwgZmFsc2UpOwoKICAgICAgICAgICAgRkFDVE9SWS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtcGFyYW1ldGVyLWVudGl0aWVzIiwgZmFsc2UpOwoKICAgICAgICAgICAgRkFDVE9SWS5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKCiAgICAgICAgICAgIEZBQ1RPUlkuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhmYWxzZSk7CgogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiWE1MIEZhY3RvcnkgaW5pdCBmYWlsZWQiLCBlKTsKCiAgICAgICAgfQoKICAgIH0KCgoKICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIG5ld0J1aWxkZXIoKSB7CgogICAgICAgIHRyeSB7CgogICAgICAgICAgICByZXR1cm4gRkFDVE9SWS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsgLy8g5q+P5qyh6KaB5paw55qEIGJ1aWxkZXIKCiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwoKICAgICAgICB9CgogICAgfQoKfQo=