C#XML文档删除模式失败的元素 - 最好将文件拆分为有效和无效

时间:2014-10-24 08:32:16

标签: c# xml linq xsd

我有一些用户数据来自一个需要作为XML提供给另一个系统的系统。定义了一个模式,但目标系统将接受XML,无论它是否通过模式,而是以静默方式失败。

我在SSIS中使用脚本组件并且可以编写自己的C#验证,但我想知道是否有人能想出一种方法来根据模式验证XML然后将XML拆分为两个文件。一个有效用户,另一个有无效用户? XSD有自定义类型,正则表达式模式等。所以我想尽可能利用已经存在的东西。我在C#中回答后最好

<Users>
  <User>
    <FirstName/>
    <LastName/>
    <Etc../>
  </User>
</Users>

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Users">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="User">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="FirstName" />
              <xs:element name="LastName" />
              <xs:element name="Etc.." />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

3 个答案:

答案 0 :(得分:1)

没有&#34;整洁&#34;解决方案 - 您的问题类似于在消息传递中进行xml交换(或#34;批处理&#34;)处理时遇到的问题,在处理批处理的过程中可能会出现故障,以及如何从中恢复。

我能想到这样做的最好方法是将输入数据XML实例转换为许多小的XML实例,而不是:

<Users>
  <User>
    ...
  </User>
  <User>
    ...
  </User>
</Users>

你只有一堆这些:

<Users>
  <User>
    ...
  </User>
</Users>

<Users>
  <User>
    ...
  </User>
</Users>

然后针对每个XML实例运行验证,然后对那些失败的问题进行验证&#34;路由&#34;处理过程。

感谢这不能直接回答你的问题,但是当它是一个XML实例时,我无法想到这样做的方法。唯一想到的是你可以注册一个ValidationEventHandler,每次验证器遇到错误时都会触发,然后在那里处理每个失败,但它似乎过多了。

答案 1 :(得分:0)

就个人而言,我会:

  1. 将XML文档加载到XDocument(System.Xml.Linq)
  2. 将XSD加载到另一个XDocument(hint
  3. 将所有预期的用户元素从XSD加载到列表中(让我们称之为预期)
  4. 将用户/用户元素加载到另一个列表中(我们称之为UserNodes)
  5. foreach UserNodes中的用户,检查Expected中的所有节点名称是否都在User中。 - &GT;失败转到一个列表,成功转到另一个
  6. 使用final Fails / Successes列表编写两个XML文件
  7. 编辑:

    如果您的XSD模式有许多不同类型需要验证(我错误地认为元素是唯一的问题),最好的方法是使用Tom的建议。

    1. 加载初始XML文档。
    2. 获取所有用户元素和foreach用户元素,为每个元素生成一个新的XDocument(将其插入父元素,使每个元素与XSD匹配)。
    3. 将每个生成的XDocument添加到List / HashSet。
    4. 使用此MSDN Validation教程找出哪个与架构匹配
    5. 我仍然会像我之前的回答一样:在一个列表上写入失败,在另一个列表上写入成功,然后写入两个不同的XML文件。

答案 2 :(得分:-1)

我想你想要两件事:

1.Validate XML

2.将XML分成有效和无效的用户。

对于1,它也可以用Java完成。请找到这个链接 http://www.journaldev.com/895/how-to-validate-xml-against-xsd-in-java也是如此。

对于2,有效和无效用户,您可以使用XSLT来定义用于隔离有效或无效用户的逻辑。可以编写Java程序来运行XSLT。