当前位置: 首页 > 知识库问答 >
问题:

XML验证,然后用C#[重复]进行转换

孙泳
2023-03-14

我使用c#console程序读取CSV文件并将其转换为中间XML文件。我想根据XSD验证XML,然后如果它有效,则执行另一个转换。问题是,我只能验证是否在生成的中间文件中包含“xmlns=urn:employee schema”条目,并且只能在包含“xmlns:ch=urn:employee schema”条目时进行转换。拥有这两个条目可以防止验证和转换。

相关代码为:

static void Transform(string inputFile, string transformFile, string outputFile)
{
    XslCompiledTransform xslTrans = new XslCompiledTransform(true);
    XsltSettings xsltSettings = new XsltSettings(true, false);

    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.Add("urn:employee-schema", "employee.xsd");

    XmlSchema compiledSchema = null;
    foreach (XmlSchema schema in schemaSet.Schemas())
    {
        compiledSchema = schema;
    }

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(compiledSchema);

    XmlReader reader = XmlReader.Create(transformFile, settings);
    xslTrans.Load(reader, xsltSettings, null);
    xslTrans.Transform(inputFile, outputFile);
}

static void Validate(string inputFile)
{
    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.Add("urn:employee-schema", "employee.xsd");

    XmlSchema compiledSchema = null;
    XmlReaderSettings settings = new XmlReaderSettings();
    foreach (XmlSchema schema in schemaSet.Schemas())
    {
        compiledSchema = schema;
    }

    settings.Schemas.Add(compiledSchema);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

    using (XmlReader reader = XmlReader.Create(inputFile, settings)) 
    {
        while (reader.Read());
    }
}

employee.xsd文件:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="urn:employee-schema"
    xmlns:ch="urn:employee-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:employee-schema">

 <xs:element name="employees" type="employeesType" />

 <xs:complexType name="employeesType">
  <xs:sequence maxOccurs="unbounded">
   <xs:element name="employee"  type="employeeType"/>
  </xs:sequence>
 </xs:complexType>

  <xs:complexType name="employeeType">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="EmployeeNo" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="Name" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

此XML将验证但不转换:

<?xml version="1.0"?>
<employees xmlns="urn:employee-schema">
  <employee>
    <EmployeeNo>2133654040058</EmployeeNo>
    <Name>Margaret Deakin</Name>
  </employee>
</employees>

此XML将转换但不验证:

<?xml version="1.0"?>
<employees xmlns:ch="urn:employee-schema">
  <employee>
    <EmployeeNo>2133654040058</EmployeeNo>
    <Name>Margaret Deakin</Name>
  </employee>
</employees>

这是XSLT转换:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" >
    <xsl:output encoding="utf-8"  method="text" indent="no"/>
    <xsl:strip-space elements="*" />

    <xsl:variable name='seperator' select='"|"' />
    <xsl:variable name='newline' select='"&#xA;"' />

    <xsl:template match="/employees">
    <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="employee">
    <xsl:text>Employee</xsl:text>
    <xsl:value-of select="$seperator"/>
    <xsl:value-of select="EmployeeNo"/>
    <xsl:value-of select="$seperator"/>
    <xsl:value-of select="Name"/>
    <xsl:value-of select="$newline" />
    </xsl:template>
</xsl:stylesheet>

共有1个答案

宁修永
2023-03-14

感谢@michael。hor257k为我指明了正确的方向。具体来说,我需要将转换XSLT更改为:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ch="urn:employee-schema"
    version="1.0" >
    <xsl:output encoding="utf-8"  method="text" indent="no"/>
    <xsl:strip-space elements="*" />

    <xsl:variable name='seperator' select='"|"' />
    <xsl:variable name='newline' select='"&#xA;"' />

    <xsl:template match="/ch:employees">
    <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="ch:employee">
    <xsl:text>Employee</xsl:text>
    <xsl:value-of select="$seperator"/>
    <xsl:value-of select="ch:EmployeeNo"/>
    <xsl:value-of select="$seperator"/>
    <xsl:value-of select="ch:Name"/>
    <xsl:value-of select="$newline" />
    </xsl:template>
</xsl:stylesheet>

以下是验证和转换:

<?xml version="1.0"?>
<employees xmlns="urn:employee-schema">
  <employee>
    <EmployeeNo>2133654040058</EmployeeNo>
    <Name>Margaret Deakin</Name>
  </employee>
</employees>```
 类似资料:
  • 我正在使用Delphi10.2更新3。我按照这些说明验证生成的xml文档。 属性noNamespaceSchema位置对XML解析有什么影响? 使用Windows DOM和TXMLDocument验证XML:在某些计算机上不起作用 delphi中msxml的模式验证 但我有一个错误。“DTD/架构中未定义元素‘jegyzek\u adatok’上的属性‘noNamespaceSchemaLocat

  • 我是XSD新手,不知道为什么我的XSD没有进行验证。我收到以下错误: s4s-elt-无效-内容.1:“参数信息”的内容无效。元素“复杂类型”无效、放错位置或出现过于频繁。 cvc复合型。2.4。d: 发现以元素“exception”开头的无效内容。此时不需要任何子元素。 XML: XSD: 我错过了什么吗?我想通过使用复杂类型并引用它们来分解它,从而使其更容易...

  • 我在验证xml文件时遇到问题。在我的xml文件中,xsi:schemaLocation=“”指向xsd文件。不幸的是,这个xsd文件加载了模式依赖项。他们都指向一些网站。因此,验证失败。所有工具和库都失败,外汇xmlspy。当我指向xml文件中的xsi:schemalocation=“”本地xsd(所有依赖项都是本地的)时,验证工作很好。 我的问题与javax.xml.validation有关,我

  • 问题内容: 我在另一个文件中有一个XML文件和一个XML模式,我想验证我的XML文件是否遵循该模式。如何在Python中执行此操作? 我希望使用标准库,但是如果需要,我可以安装第三方程序包。 问题答案: 我假设您的意思是使用XSD文件。令人惊讶的是,没有太多支持此功能的python XML库。但是,lxml确实可以。使用lxml检查验证。该页面还列出了如何使用lxml与其他架构类型进行验证。

  • 我对JSF2.2、Omnifaces 2.6.3和PrimeFaces 6.1的客户端验证有一个问题,这导致来自Bean验证的验证消息显示两次。 如果在我使用的某个按钮中 验证有效,但每次验证都会产生两条消息: 我将问题追溯到类javax.faces.validator.BeanValidator,它正在与Omnifaces org.omnifaces.taghandler.ValidateBea

  • 我想将XMl转换为另一种XMl格式。假设我在ats中有一个逻辑。埃姆沃。使改变TransformXml java文件如何集成以在camel上下文输入中转换tis(file:///d:/in)是xml文件,我想将其另存为xml。我已经将此文件作为bean类添加到camel