[英]Element http://www.w3.org/2001/XMLSchema:complexType is invalid in this context
[英]How to create an xmlSchema in code with a single complexType element?
在將XML傳遞到后端系統之前,需要將XML包裝在element標簽中。
原始的未包裝XML元素將針對其XSD文件進行驗證。 當然,包裝好的不是。
如何在驗證XML之前在代碼中創建XmlSchema
並將其提供給XmlSchemaSet
?
這是經過驗證的展開后的xml:
<ns0:Request xmlns:ns0="example.com/Service.xsd"
xmlns:ns1="example.com/Data.xsd"
xmlns:ns2="example.com/RequestSchema.xsd">
<ns0:Info>
<ns2:Id>12345</ns2:BpId>
<ns2:Name>FOO</ns2:BpName>
<ns2:Init>BAR</ns2:Initiator>
</ns0:Info>
<ns1:DATA>
</ns1:DATA>
</ns0:Request>
這是包裝的xml,我想在代碼中為其添加XmlSchema
<group xmlns:ns0="example.com/Service.xsd"
xmlns:ns1="example.com/Data.xsd"
xmlns:ns2="example.com/RequestSchema.xsd">
<ns0:Request>
<ns0:Info>
<ns2:Id>12345</ns2:BpId>
<ns2:Name>FOO</ns2:BpName>
<ns2:Init>BAR</ns2:Initiator>
</ns0:Info>
<ns1:DATA>
</ns1:DATA>
</ns0:Request>
<group>
這是我嘗試過的,但是沒有用:
var groupImport = new XmlSchemaImport { Namespace = "example.com/Service.xsd" };
var groupComplexType = new XmlSchemaComplexType
{
Particle = new XmlSchemaSequence(),
};
var groupElement = new XmlSchemaElement
{
Name = "group",
SchemaType = groupComplexType
};
var xmlSchema = new XmlSchema { TargetNamespace = "example.com/group.xsd" };
xmlSchema.Namespaces.Add("xs", "example.com/2001/XMLSchema");
xmlSchema.Includes.Add(groupImport);
xmlSchema.Items.Add(groupElement);
var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(xmlSchema);
xmlSchemaSet.Add(null, "Service.xsd");
xmlSchemaSet.Add(null, "Data.xsd");
xmlSchemaSet.Add(null, "RequestSchema.xsd");
驗證時出現此錯誤:
找不到元素“ group”的架構信息。
發生這種情況的原因有很多:
group
元素的文件; 就像您在問題中所說的那樣,假設您的其他文件正在正確驗證,則這是您需要生成的XSD(假定Service.xsd
位於同一目錄中):
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns0="example.com/Service.xsd"
targetNamespace="example.com/group.xsd">
<xs:import schemaLocation="Service.xsd" namespace="example.com/Service.xsd" />
<xs:element name="group">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns0:Request" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您可以在文件中進行以下更改,以幫助您生成有效的架構。
1) 缺少導入schemaLocation在您的代碼中,您正在生成此代碼:
<xs:import namespace="example.com/Service.xsd"/>
名稱空間只是一個字符串,而不是位置。 您應該使用SchemaLocation
提供架構的URL。 這將用於正確生成<xsd:import>
( 如果您的應用程序根據本地目錄為您找到架構, 則 可能沒有必要)。 要生成此行:
<xs:import schemaLocation="Service.xsd" namespace="example.com/Service.xsd" />
您應該使用:
var groupImport = new XmlSchemaImport {
Namespace = "example.com/Service.xsd",
SchemaLocation = "Service.xsd"
};
2) 空序列 :您正在生成一個新模式,該模式將導入所有其他模式,並創建一個包含序列的新復雜類型,但是您沒有向該序列添加任何內容。 這是您生成的:
<xs:element name="group">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
結果將是group
元素的有效聲明,但不允許您在其中放置任何內容。 根據您的示例, group
元素應包含example.com/Service.xsd
命名空間的Request
元素。 您需要生成:
<xs:sequence>
<xs:element ref="ns0:Request" />
</xs:sequence>
為此,您將需要訪問sequence
對象,並像下面這樣重寫代碼:
XmlSchemaSequence sequence = new XmlSchemaSequence();
var groupComplexType = new XmlSchemaComplexType
{
Particle = sequence,
};
然后使用限定名稱創建元素引用聲明,並將其添加到序列中。
XmlSchemaElement requestRef = new XmlSchemaElement();
requestRef.RefName = new XmlQualifiedName("ns0:Request");
sequence.Items.Add(requestRef);
您還必須將該前綴和名稱空間聲明添加到架構中,以便能夠驗證您的合格類型:
xmlSchema.Namespaces.Add("ns0", "example.com/Service.xsd");
這可能是您輸入的問題,但是xs
命名空間應以“ http://www.w3.org ”開頭,而不是以“ example.com”開頭:
xmlSchema.Namespaces.Add("xs", "http://www.w3.org/2001/XMLSchema");
通過這些更改,您應該能夠生成一個架構來驗證您的文件。
這是根據以下建議修改的代碼:
var groupImport = new XmlSchemaImport {
Namespace = "example.com/Service.xsd",
SchemaLocation = "Service.xsd"
};
XmlSchemaSequence sequence = new XmlSchemaSequence();
var groupComplexType = new XmlSchemaComplexType
{
Particle = sequence,
};
var groupElement = new XmlSchemaElement
{
Name = "group",
SchemaType = groupComplexType
};
XmlSchemaElement requestRef = new XmlSchemaElement();
requestRef.RefName = new XmlQualifiedName("ns0:Request");
sequence.Items.Add(requestRef);
var xmlSchema = new XmlSchema { TargetNamespace = "example.com/group.xsd" };
xmlSchema.Namespaces.Add("xs", "http://www.w3.org/2001/XMLSchema");
xmlSchema.Namespaces.Add("ns0", "example.com/Service.xsd");
xmlSchema.Includes.Add(groupImport);
xmlSchema.Items.Add(groupElement);
var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(xmlSchema);
xmlSchemaSet.Add(null, "Service.xsd");
xmlSchemaSet.Add(null, "Data.xsd");
xmlSchemaSet.Add(null, "RequestSchema.xsd");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.