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>

我收到错误:“'地址'元素未声明”

有什么我想念的吗?

4

2 回答 2

0

按照 MiMo 的建议,为了解决问题,我在 RUNTIME 中修改了模式。我将它加载到内存中并在那里进行更改。我在这里发布了我的解决方案:

使用附件 XSD 文件针对模式验证 XML 节点

于 2013-11-23T13:31:58.727 回答
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 回答