我与形成向下的XML元素某些XML“片段”工作。我有模式,而是因为他们是不完整的XML文档,我无法验证这些文件。这些片段包裹着必要的父元素,形成有效的XML,当他们在其他工具使用,所以我没有太多的选项,使他们成为有效的XML或更改架构。

时能够验证的元素,而不是整个文件? 如果不是,可以提出什么样的解决方法?

我工作在C#与.NET 2.0框架。

有帮助吗?

解决方案

我有一个类似的问题,我只能验证我的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);

    using (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);
}

基本上,我将它传递一个XmlNode(我通过.SelectSingleNode的手段从整个XmlDocument的选择),和XML架构这是我从我的应用程序内的嵌入式资源XSD加载。可能发生的任何验证错误被塞进一个“错误”字符串生成器,然后我在最后读出,看是否有记录的任何错误,还是不行。

适用于我 - 你的里程可能会有所不同: - )

其他提示

有是,它接受一个XmlDocument.Validate作为参数的一个XmlNode方法仅验证该节点。这可能是你在找什么...

确定,这里的另一种方法:

您可以使用XSLT转换将您的模式文件中有您的片断元素作为根一个新的模式。说你原来的模式将是

<xs:schema id="MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="RootElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="NestedElement">
          <xs:complexType>
            <xs:attribute name="Name" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

您必须要验证型NestedElement的片段:

<NestedElement Name1="Name1" />

然后,你可以使用像

的XSLT模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="xs:element[@name='NestedElement']"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:schema id="MySchema">
      <xsl:copy-of select="."/>
    </xs:schema>
  </xsl:template>
</xsl:stylesheet>

要创建已NestedElement作为根一个新的模式。生成的模式将类似于

<xs:schema id="MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="NestedElement">
    <xs:complexType>
      <xs:attribute name="Name" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>

可以然后验证使用代码针对此新模式的片断文件等

XmlSchema schema;
using (MemoryStream stream =    new MemoryStream())
using (FileStream fs = new FileStream("MySchema.xsd", FileMode.Open))
using(XmlReader reader = XmlReader.Create(fs)) {
  XslCompiledTransform transform = new XslCompiledTransform();
  transform.Load("SchemaTransform.xslt");
  transform.Transform(reader, null, stream);
  stream.Seek(0, SeekOrigin.Begin);
  schema = XmlSchema.Read(stream, null);
}
XmlDocument doc = new XmlDocument();
doc.Schemas.Add(schema);
doc.Load("rootelement.xml");
doc.Validate(ValidationHandler);

MySchema.xsd是原始模式,SchemaTransform.xslt是变换(如上所示),rootelement.xml是包含单一片段节点的XML文档。

您可以使用一个特殊的命名空间别名拨出要验证,然后仅为该命名空间的别名,但不是为别人添加架构的元素。这种方式只与您的特殊命名空间前缀这些元素将得到验证。

它似乎没有不可能做什么,我向往的事情。我目前的解决办法是创建一个空白模板XML文档。然后更换我的片段所需的元素。从那里,我相信那么验证方法是可行的。但要创造这个模板动态好像是在自己的权利另一个艰巨的任务。似乎没有要创建一个“骨架”文件没有简单的方法。

我有同样的问题。即使在这里要求的解决方案。我已经发现一种解决方法。

的问题是,只有根元素可以被验证。所以...我编辑方案在存储器中且添加元素/类型来验证到根

public static void AddElementToSchema(XmlSchema xmlSchema, string elementName, string elementType, string xmlNamespace)
{
    XmlSchemaElement testNode = new XmlSchemaElement();
    testNode.Name = elementName;
    testNode.Namespaces.Add("", xmlNamespace);
    testNode.SchemaTypeName = new XmlQualifiedName(elementType, xmlNamespace);
    xmlSchema.Items.Add(testNode);
    xmlSchema.Compile(XMLValidationEventHandler);
}

只需几行,你不得修改或添加任何XSD文件:)有了这个简单的改变你的内存架构,可以验证与您使用来验证一个完整的文件相同的代码片段。只是要确保验证片段的根元素包括命名空间。 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top