通过 XSD 删除 XML 的元素/属性

问题描述 投票:0回答:1

我想删除 .xml 文件中与 .xsd 文件定义不匹配的所有元素和/或属性。

我提供了 XML-XSD 文件对的简化版本,但它们实际上具有更多属性。因此,完全手动创建 XSL 转换将是无缝的工作。

ItemProduceRecipe.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            elementFormDefault="qualified">
    <xsd:complexType name="ItemProduceRecipe">
        <xsd:sequence>
            <xsd:element name="Recipe" type="ItemProduceRecipe_Recipe" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="ItemProduceRecipe_Recipe"
                     dc:keys="id">
        <xsd:sequence>
            <xsd:element name="Materials" type="ItemProduceRecipe_Recipe_Materials" />
            <xsd:element name="Result" type="ItemProduceRecipe_Recipe_Result" />
        </xsd:sequence>

        <xsd:attribute name="id" type="xsd:int" use="required" />
        <xsd:attribute name="needGrade" type="xsd:int" use="required" />
        <xsd:attribute name="needSkillProf" type="xsd:int" use="required" />
    </xsd:complexType>

    <xsd:complexType name="ItemProduceRecipe_Recipe_Materials">
        <xsd:sequence>
            <xsd:element name="Material" type="ItemProduceRecipe_Recipe_Materials_Material" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ItemProduceRecipe_Recipe_Materials_Material">
        <xsd:attribute name="count" type="xsd:int" use="required" />
        <xsd:attribute name="id" type="xsd:int" use="required" />
    </xsd:complexType>

    <xsd:complexType name="ItemProduceRecipe_Recipe_Result">
        <xsd:attribute name="count" type="xsd:int" use="required" />
        <xsd:attribute name="id" type="xsd:int" use="required" />
    </xsd:complexType>

    <xsd:element name="ItemProduceRecipe" type="ItemProduceRecipe" />
</xsd:schema>

ItemProduceRecipe.xml:

<ItemProduceRecipe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Recipe id="1466" needGrade="0" needSkillProf="0" junkA="cc">
        <Materials>
            <Material id="206817" count="1"/>
        </Materials>
        <Result id="200999" count="2"/>
    </Recipe>
    <Recipe id="28528" needGrade="1" needSkillProf="500" junkB="dd">
        <Materials>
            <Material id="206817" count="15"/>
            <Material id="206818" count="45"/>
            <Material id="204050" count="300"/>
        </Materials>
        <Result id="116" count="2"/>
    </Recipe>
</ItemProduceRecipe>

预期输出: 应删除 junkA 和 junkB 属性。

其他类似主题:

C#中基于XSD的Xml清理

  • 不幸的是,这需要大量的手动工作,并且只包括元素而不包括属性。

根据 1:1 映射 XSD 兼容 XML 输入 -> XSD 兼容 XML 输出,从 XSD 生成 XSLT 文件

1. 通过 XSD 创建 XSLT 是推荐的方法吗?我需要对我的文件进行任何调整吗?

2. 是否建议通过XSL转换加载XSD并删除所有不匹配的,如果是的话,这将如何通过C#来完成?

c# xml xsd
1个回答
0
投票

到目前为止对我有用的是将 .xsd 的元素和属性名称存储在字典中,并在 .xml 文件中检查它们。

© www.soinside.com 2019 - 2024. All rights reserved.