我们正在使用SAX解析器解析XML文件。是否可以从XML获取架构位置?
<view id="..." title="..."
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="{schema}">
我想从XML中检索{schema}
值。这可能吗?以及如何访问noNamespaceSchemaLocation
的此值?我正在使用默认的SAX Parser。
@Override
public void startElement(String uri, String localName,
String name, Attributes attributes)
{ .... }
谢谢。
答案 0 :(得分:1)
这完全取决于你正在使用什么样的工具/库(一个基本的SAXParser?Xerces?JDom?...)但你想要的是URI定义的namspace中属性“noNamespaceSchemaLocation”的值“ http://www.w3.org/2001/XMLSchema-instance“
在JDom中,它会是这样的:Element view = ...; // get the view element
String value = view.getAttributeValue("noNamespaceSchemaLocation", Namespace.getNamespace("http://www.w3.org/2001/XMLSchema-instance"));
答案 1 :(得分:0)
这是我使用XMLStreamReader
获得XSD名称的方法:
public static String extractXsdValueOrNull(@NonNull final InputStream xmlInput)
{
final XMLInputFactory f = XMLInputFactory.newInstance();
try
{
final XMLStreamReader r = f.createXMLStreamReader(xmlInput);
while (r.hasNext())
{
final int eventType = r.next();
if (XMLStreamReader.START_ELEMENT == eventType)
{
for (int i = 0; i <= r.getAttributeCount(); i++)
{
final boolean foundSchemaNameSpace = XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(r.getAttributeNamespace(i));
final boolean foundLocationAttributeName = SCHEMA_LOCATION.equals(r.getAttributeLocalName(i));
if (foundSchemaNameSpace && foundLocationAttributeName)
{
return r.getAttributeValue(i);
}
}
return null; // only checked the first element
}
}
return null;
}
catch (final XMLStreamException e)
{
throw new RuntimeException(e);
}
}
实际上,XMLStreamReader发挥了所有作用,即:
xsi
)