gpt4 book ai didi

c# - 为什么我的 XML 验证对其架构失败?

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

我需要根据模式验证 XML 文件。 XML 文件是在代码中生成的,在我保存它之前我需要验证它是正确的。

我已将问题简化为最基本的元素,但我遇到了问题。

XML:

<?xml version="1.0" encoding="utf-16"?>
<MRIDSupportingData xmlns="urn:GenericLabData">
<MRIDNumber>MRIDDemo</MRIDNumber>
<CrewMemberIdentifier>1234</CrewMemberIdentifier>
<PrescribedTestDate>1/1/2005</PrescribedTestDate>
</MRIDSupportingData>

架构:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="urn:GenericLabData" targetNamespace="urn:GenericLabData"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="MRIDSupportingData">
<xs:complexType>
<xs:sequence>
<xs:element name="MRIDNumber" type="xs:string" />
<xs:element minOccurs="1" name="CrewMemberIdentifier" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

ValidationCode:(此代码来 self 编写的一个简单应用程序,用于测试验证逻辑。XML 和 XSD 文件存储在磁盘上并从那里读取。在实际应用程序中,XML 文件已经在内存中作为 XmlDocument 对象,XSD 将从内部网络服务器读取。)

private void Validate()
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
//settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
//settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
//settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler(OnValidate);

XmlSchemaSet schemas = new XmlSchemaSet();
settings.Schemas = schemas;
try
{
schemas.Add(null, schemaPathTextBox.Text);
using (XmlReader reader = XmlReader.Create(xmlDocumentPathTextBox.Text, settings))
{
validateText.AppendLine("Validating...");
while (reader.Read()) ;
validateText.AppendLine("Finished Validating");
textBox1.Text = validateText.ToString();
}
}
catch (Exception ex)
{
textBox1.Text = ex.ToString();
}

}

StringBuilder validateText = new StringBuilder();
private void OnValidate(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
validateText.AppendLine(string.Format("Error: {0}", e.Message));
break;
case XmlSeverityType.Warning:
validateText.AppendLine(string.Format("Warning {0}", e.Message));
break;
}
}

当使用上面定义的 XML 和 XSD 文件运行上面的代码时,我得到这个输出:

Validating... Error: The element 'MRIDSupportingData' in namespace 'urn:GenericLabData' has invalid child element 'MRIDNumber' in namespace 'urn:GenericLabData'. List of possible elements expected: 'MRIDNumber'. Finished Validating

我错过了什么?据我所知,MRIDNumber 是 MRIDNumber 那么为什么会出错呢?

实际的 XML 文件和 XSD 一样大得多,但它在一开始就失败了,所以我将问题减少到几乎没有。

在这方面的任何帮助都会很棒。

谢谢你,
基思


顺便说一句,这些文件确实有效:

XML:

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
<book genre="novel">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
</bookstore>

架构:

  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:bookstore-schema"
elementFormDefault="qualified"
targetNamespace="urn:bookstore-schema">
<xsd:element name="bookstore">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="book" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="author">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="genre" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

最佳答案

尝试在 XSD 文件的 xs:schema 元素中添加 elementFormDefault="qualified" 属性。

我认为验证器是说它想要一个没有命名空间的 MRIDNumber 元素,而不是你的带有命名空间 urn:GenericLabDataMRIDNumber 元素.

关于c# - 为什么我的 XML 验证对其架构失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007881/

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