如何从 sxd 模式中获取 XML 节点的所有可能的子节点和属性信息?如果我传递了标签名称,是否有任何模式解析器(如 DOM)会提供此类信息?例如,如果我通过 'getChildNodes(NodeName)' 它应该给所有可能的孩子。请帮忙..提前谢谢!
问问题
254 次
2 回答
0
这取决于...有时您可以使用TypeInfoProvider获取一些信息:
package thebestone;
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.TypeInfoProvider;
import javax.xml.validation.ValidatorHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class valid
{
public static void main(String[] args) throws Exception
{
Schema schem =
SchemaFactory.
newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).
newSchema(new File("schema.xsd"));
ValidatorHandler valhand = schem.newValidatorHandler();
TypeInfoProvider typprov = valhand.getTypeInfoProvider();
valhand.setContentHandler(new TypeListener(typprov));
XMLReader read = XMLReaderFactory.createXMLReader();
read.setContentHandler(valhand);
read.parse("doc.xml");
}
public static class TypeListener extends org.xml.sax.helpers.DefaultHandler
{
TypeInfoProvider typinfo;
TypeListener(TypeInfoProvider prov)
{
typinfo = prov;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
super.startElement(uri, localName, qName, attributes);
System.out.println("localName="+localName+", typinfo="+typinfo.getElementTypeInfo());
}
}
}
于 2013-03-02T21:28:09.997 回答
0
小心你的要求。知道元素名称并不足以知道所有可能的子元素可能是什么,因为它取决于元素出现的上下文 - 在最坏的情况下,它可能是跳过验证的文档的一部分,在这种情况下它可以包含任何东西。从复杂类型开始更好,但即便如此,这也是一个复杂的问题,因为您必须考虑替换组,以及通过扩展从您的起始类型派生的类型。更不用说通配符了。
在 Saxon 中,您可以使用一些相当低级的内部 API 来做到这一点:一旦您找到了您感兴趣的 ComplexType,您可以调用gatherAllPermittedChildren() 来获取可能显示为子元素的列表,并可以选择是否要忽略内容模型中的通配符。
于 2013-02-26T18:54:49.557 回答