当前位置: 首页 > 知识库问答 >
问题:

使用Java查找可以在xml模式中重复的项

公西岳
2023-03-14

通过手工操作,我在模式中查找maxOccurs属性,查找元素标记和直接父级的标记。

例如,从

<xs:complexType name="aType">
     <xs:sequence>
          <xs:element ref="B" maxOccurs="unbounded"/>
     </xs:sequence>
</xs:complexType>

<xs:element name="A" type="aType">
<xs:element name="ANOTHER" type="aType">

我应该获得(A,B)(other,B)对。

在Java中有没有一种优雅的方法来实现这一点?您会推荐哪个库来实现这一点?

共有1个答案

翟单弓
2023-03-14

为了在Java中(不使用XSLT)处理XML模式,我们使用Xerces2 Java解析器:http://xerces.apache.org/xerces2-j/

可能需要以下包/类:

import org.w3c.dom.*;
import org.apache.xerces.xs.*;
import org.apache.xerces.dom.DOMXSImplementationSourceImpl;
import org.apache.xerces.impl.xs.util.StringListImpl;
import org.apache.xerces.util.XMLCatalogResolver;

然后,XSD文件的处理过程如下所示:

// Obtain the XML Schema implementation
XSImplementation impl = (XSImplementation)
  (new DOMXSImplementationSourceImpl()).getDOMImplementation(XMLConstants.XSD_LOADER_NAME);

// Get schema loader
XSLoader schemaLoader = impl.createXSLoader (null);

// Optional. Specify error handler
DOMErrorHandler errorHandler = ....;
DOMConfiguration config = schemaLoader.getConfig();
config.setParameter("error-handler", errorHandler);

// Optional. Specify XML catalog resolver.
// This may be needed to redirect internal DTD/schema file references
XMLCatalogResolver catalogResolver = ...;
config.setParameter("resource-resolver", catalogResolver);

String xsdURI = ...; // the location of schema file

// read schema
XSModel xsModel = schemaLoader.loadURI(xsdURI);

// PROCESS SCHEMA (here, you can do anything you want)

XSNamedMap xsMap;

// process top-level element declarations
xsMap = xsModel.getComponents(XSConstants.ELEMENT_DECLARATION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSElementDeclaration xsElementDecl = (XSElementDeclaration) xsMap.item(i);
  ...
}

// process top-level type definitions
xsMap = xsModel.getComponents(XSConstants.TYPE_DEFINITION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSTypeDefinition xsTDef = (XSTypeDefinition) xsMap.item(i);
  ...
}

// process model group definitions
xsMap = xsModel.getComponents(XSConstants.MODEL_GROUP_DEFINITION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSModelGroupDefinition xsGroupDef = (XSModelGroupDefinition) xsMap.item(i);
  ...
}

...
 类似资料:
  • 我有一个带有ID,姓名和地址字段的员工类。如果两个雇员的 ID 和姓名完全相同,则认为他们是一样的。现在我有一个员工列表,现在我的任务是收集重复的员工。 这是我的员工类代码,带有基于id和name字段重写的hascode和equals方法。 现在我有这个代码可以找到重复的员工 这段代码运行良好,并在我的集合中给出了id为1的雇员。 如何使用Java 8 lamda和streams执行相同的操作?在

  • 问题内容: 考虑我有一个文件喜欢(只是摘录) 当我发现与时,我喜欢检索。 我目前的做法是 看起来不太好 过度使用模式和匹配器似乎是错误的。 有没有更简单/更好的方法?特别是如果我有多个键,我喜欢这样搜索吗? 问题答案: 我希望有更多类似的东西,以避免两次匹配模式: 也就是说,对于每个字符串的匹配器,获取第一个匹配的字符串,对于该匹配器,将输出第一组。

  • 问题内容: 我想在中显示值。A 可能有重复的值(但没有重复的键),但是我只想显示一个值。 因此,我应该查找是否具有重复值。我知道我们可以迭代并使用的返回布尔值。我想知道是否存在任何方法来查找map中的重复值,还是我应该自己编写代码? 问题答案: 一个简单的解决方案是将值列表的大小与设置的值进行比较。

  • 我想找到“cost”tag=505.921435631349的元素的路径,我尝试过这样做,我总是有空值,这是我做过的一件事,它或多或少给了我想要的东西,它工作不正常,我将在java中使用这个路径来获得包含特定值的cost tag下面的值 我的xpath请注意,此xml文件是动态的 xml文件

  • 问题内容: 谁能给我一个Java正则表达式来识别字符串中的重复字符?我只是在寻找立即重复的字符,它们可以是字母或数字。 例: abccde <-寻找此内容(立即重复c的内容) abcdce <-不是这个(c用另一个字符分隔) 问题答案: 尝试 在任何单词字符(字母,数字或下划线)和匹配无论是在第一组括号,一次或多次的比赛。因此,您可以匹配出现的任何一个单词字符,然后立即再次匹配一个或多个相同的单词

  • 问题内容: 我有一张很大的桌子,上面有关于用户的以下数据。 我想在ssn等于但名称不等于的表中找到所有可能的重复项 我的尝试是: 问题答案: 在SSN上进行分组应该做到这一点 ~~~~ ..或如果每个ssn有很多行,而只想查找重复的名称) 编辑,糟糕,被误解