Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 如何在XML模式中找到其值被指定为QName的所有元素?_Xpath_Xsd_Saxon_Qnames - Fatal编程技术网

Xpath 如何在XML模式中找到其值被指定为QName的所有元素?

Xpath 如何在XML模式中找到其值被指定为QName的所有元素?,xpath,xsd,saxon,qnames,Xpath,Xsd,Saxon,Qnames,假设 我有一个复杂的XML模式,它导入/包含其他模式文件,而其他模式文件又导入/包含更多的模式文件 我想在这个XML模式中找到所有具有声明为QName类型的值(即文本节点)的元素 我希望将这些元素的位置(路径)表示为XPath语句(例如,/foo/bar) 如果我正在编写一个Java应用程序,什么是适合这份工作的技术?它是一个模式对象模型吗?这是最重要的吗?还有别的吗 编辑:对于那些希望在Saxon中访问SCM的人(根据下面Michael Kay的建议),这里有一些Java代码(SAN异常处

假设

  • 我有一个复杂的XML模式,它导入/包含其他模式文件,而其他模式文件又导入/包含更多的模式文件
  • 我想在这个XML模式中找到所有具有声明为QName类型的值(即文本节点)的元素
  • 我希望将这些元素的位置(路径)表示为XPath语句(例如,/foo/bar)
如果我正在编写一个Java应用程序,什么是适合这份工作的技术?它是一个模式对象模型吗?这是最重要的吗?还有别的吗

编辑:对于那些希望在Saxon中访问SCM的人(根据下面Michael Kay的建议),这里有一些Java代码(SAN异常处理):


查询模式文档是一件很难做到正确的事情,因为在XSD中有太多的方法来表达同样的事情:例如命名模型组和属性组会使任务变得相当复杂

如果您正在寻找从QName以及QName本身派生的类型,那么它确实变得非常困难

因此,在某种“已编译”模式上执行此操作比在原始模式文档上执行此操作容易得多

使用XSOM是一种方法,尽管它没有查询功能IIRC。另一种方法是使用Saxon的SCM输出:这是XML形式的已编译“模式组件模型”的表示;作为编译模式,您不必担心xs:include、xs:redefinite等的所有复杂性,而作为XML意味着您可以在其上使用XQuery。(我建议使用XQuery而不是XPath,因为会涉及很多连接,包括需要用户定义函数的递归连接。)

// Load the XSD into Saxon
Processor processor = new Processor(true);
SchemaManager schemaManager = processor.getSchemaManager(); 
DocumentBuilder documentBuilder = processor.newDocumentBuilder();
SAXSource saxSource = new SAXSource(new InputSource("path/to/yourSchema.xsd"));
XdmNode schema = documentBuilder.build(saxSource);
schemaManager.load(saxSource);
// Export the SCM
XdmDestination destination = new XdmDestination();
schemaManager.exportComponents(destination);
XdmNode xdmNode = destination.getXdmNode();
System.out.println(xdmNode.toString());