gpt4 book ai didi

java - 根据 XSD 验证 XML 中的无效属性

转载 作者:行者123 更新时间:2023-12-01 15:35:59 27 4
gpt4 key购买 nike

我想找出 xml 中的任何无效元素或属性。我使用 Oxygen XML 编辑器从 xml 创建了一个 XSD 文件。现在我尝试使用 XSD 解析和验证 xml,但即使我添加新属性,我的 xml 也会解析。下面是代码。现在,即使我将 JUNKATTRIBUTE 添加到我的 xml 中,它也会被解析。有什么建议吗?

我的代码

public static boolean validatehelp(String helpData, helpReport helpReport) {

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = null;
spf.setNamespaceAware(true);
spf.setValidating(true);

FileReader fileReader = null;
try {
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
fileReader = new FileReader("help_xsd.xsd");

spf.setSchema(sf.newSchema(new SAXSource(new InputSource(fileReader))));
//spf.setSchema(sf.newSchema(new Source[] {new StreamSource("help_xsd.xsd")}));



parser = spf.newSAXParser();

MySAXHandler handler = new MySAXHandler(configReport);

parser.parse(new InputSource(new StringReader(helpData)), handler);
return true;
}

我的 xml

<Help date="2020-06-24">
<product
id="en_US_SAN_15.0"
label="orange_16.0"
ProductName="orange 16.0 "
productName="orange 16.0 Pre"
productVersion="15.0"
baseUrl="http://help.stage.xyz.com/"
path="Help/en_US/"
ionId="orange_product_xyzlr"
ionCommentingAllowed="yes"
ionSiteArea="help"
ionRatingAllowed="yes"
ionRatingType="thumbs"
searchOptions="Community|xyz"
searchDefault="Community"
searchxyzRefinement="site=orange_V2_all"
="yes"
/>
<package
id="en_US_SAN_15.0_Using"
label="orange_16.0"
path="SAN/orange/15.0/Using"
description="SAN 15.0"
contextSensitivity="yes"
downloadContent="client.orange_V2_Using_en-us.zip"
downloadContentDefault="yes"
downloadPdf="orange_V4_help.pdf"
JUNKATTRIBUTE="JUNK"
/>
</Help>

我的 XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Help">
<xs:complexType>
<xs:sequence>
<xs:element ref="product"/>
<xs:element ref="package"/>
</xs:sequence>
<xs:attribute name="appId" />
<xs:attribute name="date" type="xs:date"/>
<xs:attribute name="locale" type="xs:NCName"/>
<xs:attribute name="pubId" />
<xs:attribute name="version" type="xs:decimal"/>
</xs:complexType>
</xs:element>
<xs:element name="product">
<xs:complexType>
<xs:attribute name="baseUrl" type="xs:anyURI"/>
<xs:attribute name="helpServiceUrl" type="xs:anyURI"/>
<xs:attribute name="id" type="xs:NCName"/>
<xs:attribute name="ionCommentingAllowed" type="xs:NCName"/>
<xs:attribute name="ionId" type="xs:NCName"/>
<xs:attribute name="ionRatingAllowed" type="xs:NCName"/>
<xs:attribute name="ionRatingType" type="xs:NCName"/>
<xs:attribute name="ionSiteArea" type="xs:NCName"/>
<xs:attribute name="label" />
<xs:attribute name="multidomain" type="xs:NCName"/>
<xs:attribute name="path" />
<xs:attribute name="productName" type="xs:NCName"/>
<xs:attribute name="productVersion" type="xs:NCName"/>
<xs:attribute name="searchxyzRefinement" />
<xs:attribute name="searchBlueprintRefinement" type="xs:NCName"/>
<xs:attribute name="searchCommunityRefinement" type="xs:NCName"/>
<xs:attribute name="searchDefault" type="xs:NCName"/>
<xs:attribute name="searchOptions" />
</xs:complexType>
</xs:element>
<xs:element name="package">
<xs:complexType>
<xs:attribute name="alias" />
<xs:attribute name="baseUrl" type="xs:anyURI"/>
<xs:attribute name="contextSensitivity" type="xs:NCName"/>
<xs:attribute name="deprecated" type="xs:NCName"/>
<xs:attribute name="description" />
<xs:attribute name="downloadContent" />
<xs:attribute name="downloadContentDefault" type="xs:NCName"/>
<xs:attribute name="downloadPdf" type="xs:NCName"/>
<xs:attribute name="helpmapPath" type="xs:anyURI"/>
<xs:attribute name="id" type="xs:NCName"/>
<xs:attribute name="label" />
<xs:attribute name="packageGenerator" type="xs:NCName"/>
<xs:attribute name="path" />
<xs:attribute name="urlParams" />
</xs:complexType>
</xs:element>
</xs:schema>

最佳答案

XML 文件在以下情况下有效:

  • 结构良好
  • 它符合与其关联的任何定义的架构类型。

在您的情况下,xml 文档格式良好,并且没有与之关联的架构。因此它是有效的。

如果要将 xml 与您定义的类型关联起来,您需要使用命名空间。

您的架构声明:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="myNamespaceHere" xmlns="myNamespaceHere">
...
</xs:schema>

您的 xml 实例:

<Help date="2020-06-24" xmlns="myNamespaceHere">
...
</Help>

现在,当您验证它时,您的解析器将知道根据 XSD 进行验证。

更新

正如 Petru 在评论中指出的那样,从 XSD 有效性 的角度来看,这种有效性是不正确的。进行验证实际上并不需要命名空间,但在不需要命名空间的情况下,架构属性 elementFormDefault 应设置为“unqualified”,以指示可以引用架构中的类型没有命名空间资格。

但是,XSD 解析器通常会忽略没有命名空间的模式实例,这就是为什么从解析器的角度来看,非命名空间的 xml 实例始终返回为“有效”(只要其格式正确)。

关于java - 根据 XSD 验证 XML 中的无效属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8832219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com