我使用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='"
"' />
<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>
感谢@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='"
"' />
<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