0

如何从 sxd 模式中获取 XML 节点的所有可能的子节点和属性信息?如果我传递了标签名称,是否有任何模式解析器(如 DOM)会提供此类信息?例如,如果我通过 'getChildNodes(NodeName)' 它应该给所有可能的孩子。请帮忙..提前谢谢!

4

2 回答 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 回答