1

XML スキーマに対して XML ノードまたはフラグメントを検証しようとしています。私はこの記事を読みました:

ドキュメント全体ではなく、xml ノードを検証する

しかし、選択したソリューションは私にはうまくいかないようです。

private void ValidateSubnode(XmlNode node, XmlSchema schema)
{
  XmlTextReader reader = new XmlTextReader(node.OuterXml, XmlNodeType.Element, null);

  XmlReaderSettings settings = new XmlReaderSettings();
  settings.ConformanceLevel = ConformanceLevel.Fragment;
  settings.Schemas.Add(schema);
  settings.ValidationType = ValidationType.Schema;
  settings.ValidationEventHandler += new ValidationEventHandler(XSDValidationEventHandler);

  XmlReader validationReader = XmlReader.Create(reader, settings);

  while (validationReader.Read())
  {
  }
}

private void XSDValidationEventHandler(object sender, ValidationEventArgs args)
{
  errors.AppendFormat("XSD - Severity {0} - {1}", 
                  args.Severity.ToString(), args.Message);
}

これは、私が見る限り、完全なドキュメントを検証するためのコードですが、「ConformanceLevel.Fragment」を使用しています

したがって、たとえば、次のような単純なスキーマを持つとします。

<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name="Customer">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="Address">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Line1" type="xsd:string" />
            <xsd:element name="Line2" type="xsd:string" />
          </xsd:sequence>
       </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
</xsd:schema>

「ルート」ノードは OK を検証します

<Customer>
  <Address>
    <Line1>Foo</Line1>
    <Line2>Foo2</Line2>
  </Address>
</Customer>

しかし、内部ノードは検証されません

  <Address>
    <Line1>Foo</Line1>
    <Line2>Foo2</Line2>
  </Address>

「'Address' 要素が宣言されていません」というエラーが表示されます

足りないものはありますか?

4

2 に答える 2

0

スキーマはスタンドアロンAddress要素を許可していないため、それだけを渡すと検証は失敗します。

次のようにスキーマを変更します。

<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  <xsd:element name="Address">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Line1" type="xsd:string" />
        <xsd:element name="Line2" type="xsd:string" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="Customer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="Address"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

XSD を使用した XML のフラグメントの検証は実際には機能しません。XSD と一致するドキュメント内の場所に応じて、同じ要素が有効であるかどうか、または有効な構造が異なる可能性があるため、スタンドアロンの要素を検証することはできません。 (一般的に)可能です。

于 2013-10-07T18:44:59.033 に答える