gpt4 book ai didi

java - XML 验证中的问题。 MIn 出现工作不正常

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:24 26 4
gpt4 key购买 nike

我有一个示例代码,我在其中尝试使用 xml 验证方法来验证 xml。除了 minOccurs 之外,它也可以正常工作。我已经给出了下面的代码。请帮我找出我的错误。

XSD 文件 (Live.xsd):-

            <?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xsd:element name="Test" />

<xsd:complexType name="Test">
<xsd:sequence>
<xsd:element ref="player" />
</xsd:sequence>
</xsd:complexType>


<xsd:element name="player" >

<xsd:complexType>
<xsd:sequence minOccurs="2">
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="houseno" type="xsd:int" />
<xsd:element name="street" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" />
</xsd:complexType>
</xsd:element>


</xsd:schema>

Xml 文件(example.xml):-

                <?xml version="1.0" encoding="UTF-8"?>

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="Live.xsd" >

<player id="1">
<name>Owen</name>
<address>
<houseno>10</houseno>
<street>downing hill</street>
</address>
</player>

</Test>

Java 方法:-

                                 private void validate(File xml) {
try {
url = new URL(xsd.toURI().toString());//xsd
} catch (MalformedURLException e) {
e.printStackTrace();
}


source = new StreamSource(xml); //xml
try {
System.out.println(url);
schema = schemaFactory.newSchema(url);
} catch (SAXException e) {
e.printStackTrace();
}
validator = schema.newValidator();
System.out.println(xml);
try {
validator.validate(source);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

我也尝试在 中设置 minOccurs=2 但没有成功

最佳答案

请记住,maxOccurs 的默认值为 1。您允许最少 2 次,最多 1 次...

尝试 <xsd:sequence minOccurs="2" maxOccurs="unbounded">

编辑:不过要小心“unbounded”;您可能希望将其设置为可接受的最大值,但又不想让任何人有机会用大量节点轰炸您的系统。

Edit2:提供了上面的 xsd(用 maxOccurs 修正)和 xml,这段代码将输出 “Validation failed!!!”:

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class XMLValidate {

static File xsd;
static File xml;
static URL url;
static StreamSource source;
static SchemaFactory schemaFactory;
static Schema schema;
static Validator validator;

/**
* @param args
*/
public static void main(String[] args) {
xml = new File("example.xml");
xsd = new File("Live.xsd");

try {
url = new URL(xsd.toURI().toString());// xsd
} catch (MalformedURLException e) {
e.printStackTrace();
}

source = new StreamSource(xml); // xml
try {
//System.out.println(url);
schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = schemaFactory.newSchema(url);
} catch (SAXException e) {
e.printStackTrace();
}
validator = schema.newValidator();
//System.out.println(xml);
try {
validator.validate(source);
System.out.println("Validation succesful!");
} catch (SAXParseException e) {
System.out.println("Validation failed!!!");
//e.printStackTrace(); -- uncomment for detailed info on validation failing
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

如果您更改代码以验证以下example2.xml,它将输出“验证成功!”:

<?xml version="1.0" encoding="UTF-8"?>

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<player id="1">
<name>Owen</name>
<address>
<houseno>10</houseno>
<street>downing hill</street>
</address>
<name>Maggy</name>
<address>
<houseno>10</houseno>
<street>downing hill</street>
</address>
</player>

</Test>

带有 minOccurs=2 的 xsd 会强制您在 xml 中使用序列名称-地址两次。不确定那是否是您最初要找的东西;这让我觉得很奇怪,但我不了解这些要求。

关于java - XML 验证中的问题。 MIn 出现工作不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996681/

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