如何从sxd架构获取XML节点的所有可能的子元素和属性信息?是否有任何模式解析器(如DOM),如果我传递了标记名称,它将提供此类信息?对于例如如果我传递'getChildNodes(NodeName)'它应该给所有可能的孩子。请帮助..提前致谢!
答案 0 :(得分:0)
要小心你所要求的。知道元素名称不足以知道所有可能的子元素是什么,因为它取决于元素出现的上下文 - 在最坏的情况下,它可能是跳过验证的文档的一部分,在这种情况下它可以包含任何东西。从复杂类型开始更好,但即便如此,这也是一个复杂的问题,因为您必须考虑替换组,以及通过扩展从您的起始类型派生的类型。更不用说通配符了。
在Saxon中,您可以使用一些相当低级别的内部API来实现:一旦找到了您感兴趣的ComplexType,就可以调用gatherAllPermittedChildren()来获取可能显示为子元素的元素列表,是否要忽略内容模型中的通配符的选项。
答案 1 :(得分: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());
}
}
}