1

我正在编写一个服务,它从内存中读取一串以逗号分隔的值(及其标签)并将它们打包到一个 XML 文件中发送。数据所有者正在为每个 XML 结构生成一个关联的 XSD 文件。.txt在通过 Web 服务发布 XML 之前,我想阅读 XSD 文件以验证文件中的数据标签列表。如果检测到 XSD 和 txt 文件之间存在差异,我希望代码抛出异常。如果匹配成功,它会从.txt文件中获取值,打包并发布 XML 请求。我正在寻找如何做到这一点的整个过程(从输入到输出)的示例。

读取输入文件并收集属性和值 (TestValuesIN.txt)

 "test.Foo", 122;

打开一个 XSD 文件并根据我的输入文件的元素列表对元素执行一对一的匹配。现在我只关心 XSD 中存在的“Test.Foo”(元素:Test.Foo val:)。(TextXSD.xsd)

<?xml version="1.0"?>
<!-- Generated using Flame-Ware Solutions XML-2-XSD v2.0 at http://www.flame-ware.com/Products/XML-2-XSD/ -->
<xs:schema id="batch-execution" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="batch-execution" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="insert">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="test.Foo" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="val" type="xs:string" minOccurs="0" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="fire-all-rules">
                    <xs:complexType>
                        <xs:attribute name="max" type="xs:string" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="get-objects">
                    <xs:complexType>
                        <xs:attribute name="out-identifier" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

然后将 XML 发布到

http://mycamelhump.<myurl>.com:8080/drools-camel-service/kservice/CommTestXML/execute 

URI

<batch-execution>
 <insert>
  <test.Foo>
    <val>122</val>
  </test.Foo>
</insert>
<fire-all-rules max="-1"/>
<get-objects out-identifier="also-foo"/>
</batch-execution>

代码获取结果将输出打印到 (TestValuesOUT.txt)

"Test.Foo", 100;
4

1 回答 1

0

如果您尝试构建 xml 文档并使用 .NET XML 模式集来验证您的 xml,然后再将其发布到您的 Web 服务 - 如下所示:

public List<string> ValidateXml(string xml, string rootXsdName)
    {
        List<string> xsdValidationErrors = new List<string>();

        try
        {
            // Note: Don't use XDocument schema validation as this will give a false positive of a string without XSD specified       
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
            settings.ValidationEventHandler += ((o, e) => xsdValidationErrors.Add(e.Message));
            settings.Schemas = GetXmlSchemas(rootXsdName);

            TextReader textReader = new StringReader(xml);
            XmlReader reader = XmlReader.Create(textReader, settings);

            // Parse the file.          
            while (reader.Read())
            {
                //Empty control loop to read through entire document getting errors uaing ValidationEventHandler
            }
        }
        catch (Exception ex)
        {
            xsdValidationErrors.Add("Unable to parse XML");
        }


        return xsdValidationErrors;
    }

GetXmlSchemas 的实现将如下所示...

  /// <summary>
    /// Generates an XmlSchema set to use to validate the xDocument
    /// </summary>
    private XmlSchemaSet GetXmlSchemas(string xsdFileName)
    {
        XmlSchemaSet schemas = new XmlSchemaSet();

        // ... build the schema set here

        return schemas;
    }

所以 - GetXmlSchemaSet 将加载你所有的 xsd 文件(如果你有多个文件)

高温高压

于 2013-02-19T19:19:09.643 回答