我有Java代码
String xml = "/Users/test/xml/test.xml";
// long startTime = System.nanoTime();
Source xmlFile = new StreamSource(new File(xml));
System.out.println(xmlFile.getSystemId() + " is valid");
XML文件是
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY test SYSTEM "file:///Users/test/list" >]>
<cds>
<user>&test;</user>
当我按照我的理解执行代码时,getSystemId应该打印“ file:/// Users / test / list”,但是它打印“ /Users/test/xml/test.xml”。我的代码中是否有任何错误,或者有什么方法可以提取systemID?
您的推理与您的代码在做些事情。代码正在执行应做的工作。
根据文档StreamSource#getSystemId()
方法返回:
使用setSystemId设置的系统标识符,如果未调用setSystemId,则为null。
您获得的输出是正确的,因为当您向new File(xml)
构造函数提供StreamSource
时,根据StreamSource
类定义,它接受如下:
/**
* Construct a StreamSource from a File.
*
* @param f Must a non-null File reference.
*/
public StreamSource(File f) {
//convert file to appropriate URI, f.toURI().toASCIIString()
//converts the URI to string as per rule specified in
//RFC 2396,
setSystemId(f.toURI().toASCIIString());
}
因此,这就是为什么您获得提供的实际文件名/Users/test/xml/test.xml
,而不是您的推理意图的原因。
我猜您可能希望它会奇迹般地从xml
行中的<!ENTITY test SYSTEM "file:///Users/test/list" >]>
文件中提取它。这是错误的!
尝试搜索一些xml解析库,或者自己解析文件内容。
仅供参考:-您总是可以查看在IDE中使用的类的代码。
ref:https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/StreamSource.html#getSystemId()