簡體   English   中英

如何使用單個complexType元素在代碼中創建xmlSchema?

[英]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”的架構信息。

發生這種情況的原因有很多:

  1. 模式位置可能不正確,並且未找到聲明group元素的文件;
  2. 聲明生成不正確,
  3. 在錯誤的名稱空間中
  4. 在錯誤的上下文中等等。

就像您在問題中所說的那樣,假設您的其他文件正在正確驗證,則這是您需要生成的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM