0

我正在尝试验证以下 Xml。

string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
                    <ROOT xmlns:bk=""urn:samples"">
                        <RandomName1>
                            <Element1>v</Element1>
                            <Element2>v</Element2>
                            <Element3>v</Element3>
                            <Element4>v</Element4>
                    </RandomName1>
                        <RandomName2>
                            <Element1>v</Element1>
                            <Element2>v</Element2>
                            <Element3>v</Element3>
                            <Element4>v</Element4>
                    </RandomName2>
                    </ROOT>";

RandomNameN是任何字符串。我有兴趣确保Element1 - Element4它们存在并正确命名并且架构匹配。

我试过以下

string xsdMarkup =
                @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
                   <xsd:element name='ROOT'>
                    <xsd:complexType>
                     <xsd:sequence>
                      <xsd:any>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name ='Element1'/>
                                <xsd:element name ='Element2'/>
                                <xsd:element name ='Element3'/>
                                <xsd:element name ='Element4'/>
                            </xsd:sequence>
                        </xsd:complexType>
                        </xsd:any>
                     </xsd:sequence>
                    </xsd:complexType>
                   </xsd:element>
                  </xsd:schema>";

XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));

var xDoc = XDocument.Parse(xml);

bool errors = false;
string msg = string.Empty;

xDoc.Validate(schemas, (o, e) =>
    {
        msg = e.Message;
        errors = true;
    });

我正进入(状态System.Xml.Schema.XmlSchemaException

此上下文不支持“ http://www.w3.org/2001/XMLSchema:complexType ”元素。

我还需要知道如何使RandomName1节点不需要名称而是存在。我试图通过</xsd:any>而不是</xsd:element>

4

2 回答 2

2

正如我在评论中提到的那样,的用法<xsd:any>不正确。

此外,<xsd:sequence>也不能包含 complexType。请参阅:http: //msdn.microsoft.com/en-us/library/ms256089.aspx

我还建议不要使用像 RandomNameN 这样的模式来识别你的元素,而更像是:<RandomName id='N'>. 说到 OO,您可以将 XSD 视为您的 Class 定义,其中complexTypes是类,并且elements是对类实例的引用complexTypes,因此对于元素,您还应该定义它们的type.

然后,您的 XML 文档将代表您的对象。对象的类型在标签中表示。

您的 complexType 可以包装在元素中。并且由于序列中有可变数量的元素,因此您应该设置maxOccurs为无界。您生成的 Schema 应如下所示:

    <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
       <xsd:element name='ROOT'>
          <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="RandomName" maxOccurs='unbounded'>
                  <xsd:complexType>
                     <xsd:sequence>
                       <xsd:element name="Element" minOccurs='4' maxOccurs='4' type="xsd:string" />
                    </xsd:sequence>
                  </xsd:complexType>
               </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
       </xsd:element>
    </xsd:schema>>

在这种情况下,您的 XML 可能如下所示:

<ROOT >
     <RandomName>
        <Element>v</Element>
        <Element>v</Element>
        <Element>v</Element>
        <Element>v</Element>
     </RandomName>
     <RandomName>
        <Element>v</Element>
        <Element>v</Element>
        <Element>v</Element>
        <Element>v</Element>
     </RandomName>
 </ROOT> 

最后,如果 RandomName1 - RandonNameN 来自同一类型(如果我们说的是 OO,则为 Class),那么 XML 文件中的标签也应该是相同的。Element1-Element4 也是如此。

但是,如果它们属于不同类型但具有共同元素,则可以使用继承。

Element1例如,可能看起来像这样:

<complexType name="Element1">
    <complexContent>
        <extension base="Element">
            <sequence>
                <xs:element type="xs:string" name="additionalField"/>
            </sequence>
        </extension>
    </complexContent>
</complexType>
于 2013-08-09T12:24:39.727 回答
0

我不知道 xml 生产者是否在您的控制之下。如果是,您可以解决它,例如使用具有固定名称的元素和一些包含随机名称的属性,smth like <FixedNameElement randomName="...">

于 2013-08-09T09:56:34.683 回答