如何使用某个模式解析器从sxd模式获取XML节点的子节点和属性信息?

时间:2013-02-26 14:17:40

标签: xml dom schema

如何从sxd架构获取XML节点的所有可能的子元素和属性信息?是否有任何模式解析器(如DOM),如果我传递了标记名称,它将提供此类信息?对于例如如果我传递'getChildNodes(NodeName)'它应该给所有可能的孩子。请帮助..提前致谢!

2 个答案:

答案 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());
    }
  }
}