XSD-在嵌套复杂类型中使用任意

XSD-在嵌套复杂类型中使用任意,xsd,Xsd,在下面的XSD中,当我试图在扩展模式中的AdditionalInfo下定义元素时,我得到一个错误,说“限制无效粒子”。有人能帮我实现嵌套复杂类型的目标吗?我可以限制继承类型中的元素 我看到了链接,但我的问题有点不同 <?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" x

在下面的XSD中,当我试图在扩展模式中的AdditionalInfo下定义元素时,我得到一个错误,说“限制无效粒子”。有人能帮我实现嵌套复杂类型的目标吗?我可以限制继承类型中的元素

我看到了链接,但我的问题有点不同

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="BaseActivityWithIncidentId">
<xs:sequence>
  <xs:element name="Category" type="xs:string"/>
  <xs:element name="SubCategory" type="xs:string"/>
  <xs:element name="IncidentId" type="xs:long"/>
  <xs:element name="ActivityTime" type="xs:dateTime"></xs:element>
  <xs:element name="Remarks" type="xs:string"></xs:element>
  <xs:element name="AdditionalInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:sequence>
  </xs:complexType>

  <xs:complexType name="PartInstalledRequest">
<xs:complexContent>
  <xs:restriction base="BaseActivityWithIncidentId">
    <xs:sequence>
      <xs:element name="Category" type="xs:string" fixed="Part"/>
      <xs:element name="SubCategory" type="xs:string" fixed="Installed"/>
      <xs:element name="IncidentId" type="xs:long"/>
      <xs:element name="ActivityTime" type="xs:dateTime"></xs:element>
      <xs:element name="Remarks" type="xs:string"></xs:element>
      <xs:element name="AdditionalInfo">
        <xs:complexType>
          <xs:sequence>    
            <xs:element name="PartName" type="xs:string"></xs:element>
            <xs:element name="PartNumber" type="xs:string"></xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:restriction>
</xs:complexContent>
  </xs:complexType>
</xs:schema>

我正在粘贴有问题的完整代码。我不知道Megha为什么你没有面对这个问题,但是你可以试试这个代码

string baseSchema = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:complexType name=""BaseActivityWithIncidentId"">
<xs:sequence>
<xs:element name=""Category"" type=""xs:string""/>
<xs:element name=""SubCategory"" type=""xs:string""/>
<xs:element name=""IncidentId"" type=""xs:long""/>
<xs:element name=""ActivityTime"" type=""xs:dateTime""></xs:element>
<xs:element name=""Remarks"" type=""xs:string""></xs:element>
<xs:element name=""AdditionalInfo"">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs=""0"" maxOccurs=""unbounded""/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>";
string inheritedSchema = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" 
id=""PartInstalled"">
<xs:include id=""BaseSchema"" schemaLocation=""BaseSchema.xsd"" />
<xs:element name=""Activity"">
<xs:complexType>
<xs:complexContent>
<xs:restriction base=""BaseActivityWithIncidentId"">
<xs:sequence>
<xs:element name=""Category"" type=""xs:string"" fixed=""Part""/>
<xs:element name=""SubCategory"" type=""xs:string"" fixed=""Installed""/>
<xs:element name=""IncidentId"" type=""xs:long""/>
<xs:element name=""ActivityTime"" type=""xs:dateTime""></xs:element>
<xs:element name=""Remarks"" type=""xs:string""></xs:element>
<xs:element name=""AdditionalInfo"">
<xs:complexType>
<xs:sequence>    
<xs:element name=""PartName"" type=""xs:string""></xs:element>
<xs:element name=""PartNumber"" type=""xs:string""></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
var schema = schemas.Add("", 
XmlReader.Create(new StringReader(inheritedSchema)));
schemas.Add("", XmlReader.Create(new StringReader(baseSchema)));
schemas.Compile();
string xml = @"<Activity>
<Category>Part</Category>
<SubCategory>Installed</SubCategory>
<IncidentId>1</IncidentId>
<ActivityTime>2015-08-11T15:00:00.587Z</ActivityTime>
<Remarks>123</Remarks>
<AdditionalInfo>
<PartName>CR</PartName>
<PartNumber>CR123</PartNumber>
</AdditionalInfo>
</Activity>";
XDocument doc = XDocument.Parse(xml);
string msg = "";
doc.Validate(schemas, (o, e) =>
{
msg += e.Message + Environment.NewLine;
});
Console.WriteLine(msg == "" ? "Document is valid" : 
"Document invalid: "+     msg);
Console.ReadLine();
string baseSchema=@”
";
字符串inheritedSchema=@”
";
XmlSchemaSet schemase=新的XmlSchemaSet();
var schema=schemas.Add(“”,
Create(newstringreader(inheritedSchema));
schemas.Add(“,XmlReader.Create(newstringreader(baseSchema)));
schemas.Compile();
字符串xml=@“
部分
安装
1.
2015-08-11T15:00:00.587Z
123
铬
CR123
";
XDocument doc=XDocument.Parse(xml);
字符串msg=“”;
文档验证(模式,(o,e)=>
{
msg+=e.Message+Environment.NewLine;
});
Console.WriteLine(消息=“”?“文档有效”:
“文件无效:”+msg);
Console.ReadLine();

如果要定义嵌套的复杂类型,可以执行以下操作。您可以定义一个新的复杂类型,就像“PartInstalledRequest”一样,并将其用作AddationalInfo中的类型

<xs:complexType name="BaseActivityWithIncidentId">
   <xs:sequence>
     <xs:element name="Category" type="xs:string"/>
     <xs:element name="SubCategory" type="xs:string"/>
     <xs:element name="IncidentId" type="xs:long"/>
     <xs:element name="ActivityTime" type="xs:dateTime"></xs:element>
     <xs:element name="Remarks" type="xs:string"></xs:element>
     <xs:element name="AdditionalInfo" type="AddtionalType" minOccurs="0"
               maxOccurs="unbounded">   
     </xs:element>
     </xs:sequence>
  </xs:complexType>  
  <xs:complexType name="AddtionalType">
    <xs:complexContent>
       <xs:sequence>    
          <xs:element name="PartName" type="xs:string"></xs:element>
          <xs:element name="PartNumber" type="xs:string"></xs:element>
      </xs:sequence>    
    </xs:complexContent>
  </xs:complexType>

如果要定义嵌套的复杂类型,可以执行以下操作。您可以定义一个新的复杂类型,就像“PartInstalledRequest”一样,并将其用作AddationalInfo中的类型

<xs:complexType name="BaseActivityWithIncidentId">
   <xs:sequence>
     <xs:element name="Category" type="xs:string"/>
     <xs:element name="SubCategory" type="xs:string"/>
     <xs:element name="IncidentId" type="xs:long"/>
     <xs:element name="ActivityTime" type="xs:dateTime"></xs:element>
     <xs:element name="Remarks" type="xs:string"></xs:element>
     <xs:element name="AdditionalInfo" type="AddtionalType" minOccurs="0"
               maxOccurs="unbounded">   
     </xs:element>
     </xs:sequence>
  </xs:complexType>  
  <xs:complexType name="AddtionalType">
    <xs:complexContent>
       <xs:sequence>    
          <xs:element name="PartName" type="xs:string"></xs:element>
          <xs:element name="PartNumber" type="xs:string"></xs:element>
      </xs:sequence>    
    </xs:complexContent>
  </xs:complexType>


在AdditionalInfo下使用“Any”类型的关键在于,我们不知道将在其下出现的元素类型,例如,部件卸载请求可能具有不同的元素。因此,您建议的解决方案对meDo不起作用您的意思是希望模式处理某种动态内容吗?嗨..我再次检查了您的xsd,发现错误为“限制无效粒子”“如果我错误地定义了架构定义,即我编辑并粘贴了完整代码的这一行,请尝试Megha@KrishanArora:我在代码中明确看到的一个问题是,您使用的是限制基,而不是向派生类中的AdditionalInfo添加其他元素。但使用限制基时,基类型不能更改或扩展;只有元素可以被限制AdditionalInfo下有“Any”类型的关键是我们不知道它下将出现的元素类型,例如一个部件卸载请求可以有不同的元素。因此,您建议的解决方案对meDo不起作用您的意思是希望模式处理某种动态内容吗?嗨..我再次检查了您的xsd,发现错误为“限制无效粒子”“如果我错误地定义了架构定义,即我编辑并粘贴了完整代码的这一行,请尝试Megha@KrishanArora:我在代码中明确看到的一个问题是,您使用的是限制基,而不是向派生类中的AdditionalInfo添加其他元素。但使用限制基时,基类型不能更改或扩展;只有元素可以被限制