如何处理无效的子元素?
问题描述:
我有几个XML是这样的:如何处理无效的子元素?
-<PURCHASE xmlns:odf="urn:xmlns:eAccepta:output-data-fields">
-<PO TYPE="PURCHASEORDER">
<CUSTPONUM>PO0000</CUSTPONUM>
<CUSTNUM/>
<CUSTNAME>Custom name</CUSTNAME>
<DATE>2014-01-06</DATE>
<CUSTPREFIX>5LAN</CUSTPREFIX>
<MEMO/>
</PO>
-<POLINES>
-<LINE>
<LINENUM>0</LINENUM>
<CUSTLINE>1</CUSTLINE>
<CUSTITEM>013169</CUSTITEM>
<ITEMREV>A</ITEMREV>
<DESCRIPTION>Description</DESCRIPTION>
<QTY>2</QTY>
<PRICE>46.14</PRICE>
<DUEDATE>2014-01-30</DUEDATE>
<OURITEM>gfd4fd</OURITEM>
<CUSTREF>013169</CUSTREF>
<ITEMMEMO/>
</LINE>
</POLINES>
</PURCHASE>
从这个XML我已经生成的XSD:
<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="PURCHASE">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PO">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CUSTPONUM" type="xsd:string" />
<xsd:element name="CUSTNUM" type="xsd:string" />
<xsd:element name="CUSTNAME" type="xsd:string" />
<xsd:element name="DATE" type="xsd:dateTime" />
<xsd:element name="CUSTPREFIX" type="xsd:string" />
<xsd:element name="MEMO" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="TYPE" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="POLINES">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="LINE">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="LINENUM" type="xsd:int" />
<xsd:element name="CUSTLINE" type="xsd:int" />
<xsd:element name="CUSTITEM" type="xsd:int" />
<xsd:element name="ITEMREV" type="xsd:string" />
<xsd:element name="DESCRIPTION" type="xsd:string" />
<xsd:element name="QTY" type="xsd:int" />
<xsd:element name="PRICE" type="xsd:decimal" />
<xsd:element name="DUEDATE" type="xsd:dateTime" />
<xsd:element name="OURITEM" type="xsd:string" />
<xsd:element name="CUSTREF" type="xsd:int" />
<xsd:element name="ITEMMEMO" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
现在我的代码不断抱怨这是一个无效的子元素。我从外部应用程序获取XML,所以我无法更改XML的任何内容。
我的代码来处理XML的这个样子的:
public void ValidateXmlDocument(string documentToValidate, string schemaPath)
{
XmlSchema schema;
using (var schemaReader = XmlReader.Create(@"C:\XML\XMLSchema.xsd"))
{
schema = XmlSchema.Read(schemaReader, ValidationEventHandler);
}
var schemas = new XmlSchemaSet();
schemas.Add(schema);
var settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schemas;
settings.ValidationFlags =
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationEventHandler;
using (var validationReader = XmlReader.Create(documentToValidate, settings))
{
while (validationReader.Read())
{
Console.WriteLine("ValidateXmlDocument ok");
}
}
}
private static void ValidationEventHandler(
object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Error)
{
throw args.Exception;
}
Console.WriteLine(args.Message);
}
我得到的错误是
The element 'POLINES' has invalid child element 'LINE'.
当我与它告诉我,一个免费的在线XML验证验证XML对于XSD文件来说是完全完美的。 虽然我的代码不断给我错误。
答
我改变<xsd:element name="LINE">
到<xsd:element maxOccurs="unbounded" name="LINE">
希望这会帮助别人一天固定它自己。
这不是一个选项,因为可能会发生多次。如果出现0或1次,可以使用“全部”。也;我的孩子元素都按照我的XSD正确对应。 –
Matheno