将 Any-Element 添加到动态创建的 XSD-Schema 时出现问题

Problems adding Any-Element to dynamically created XSD-Schema

我只想将一个 Any-element 节点添加到现有的 XSD-由此代码粒子创建的模式:

    private void CreateSchema()
    {
        //This function returns the XML Schema definition of a XML Element by using the Generation function of a Dataset

        XmlSchemaInference x_scheme = new XmlSchemaInference();
        this.XsDSchemaSet = x_scheme.InferSchema(this.myXmlElement.CreateReader());

        this.XsDSchemaSet.Compile();;
    } 

在我创建 XSD-Schemaset 之后,一些部分必须修改。下面的代码设置了现有元素的 Min- 和 max-Occurs 属性,这也能正常工作。 修改属性后,我还必须将 XmlSchemaElement 类型的元素添加到 XmlSchemaSequence 的项目集合中,就像您在示例代码末尾上方的几行中看到的那样。那是行不通的。调试时我可以看到 Items 集合中的元素,但是在重新处理和重新编译 Schemaset 之后,修改后的属性设置得很好,但是生成的 Any-element 并不像您在最终结果的 MessageBox 中看到的那样存在。有人可以帮忙吗?

  private bool ModifyXsdElement(XmlSchemaElement element, XElement myXmlElement)
    {
        // this function modifies the occurance min an max of the child elements

        XmlSchemaSimpleType simpleType = element.ElementSchemaType as XmlSchemaSimpleType;
        if (simpleType != null)
        {
            MessageBox.Show("Function XsdModifyElement: Error - Simple Type!");
            return false;
        }
        else
        {
            XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
            if (complexType != null) //This is a complexType object
            {
                if (complexType.AttributeUses.Count > 0)
                {
                    //todo: anything if there are attributes
                }
                bool typeMatch = false;
                XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
                if (sequence != null)
                {
                    typeMatch = true;
                    string fixedValue = string.Empty;
                    XmlSchemaElement el = new XmlSchemaElement();
                    foreach (XmlSchemaElement childElement in sequence.Items)
                    {
                        //MessageBox.Show("Child Element: " + childElement.Name);
                        int iOccCtr = GetNoOfXmlChildElements(childElement.Name, myXmlElement);
                        childElement.MinOccurs = iOccCtr;
                        childElement.MaxOccurs = iOccCtr;
                        childElement.MinOccursString = iOccCtr.ToString();
                        childElement.MaxOccursString = iOccCtr.ToString();
                        if (FixedValues.TryGetValue(childElement.Name.ToString(), out fixedValue))
                            childElement.FixedValue = fixedValue;
                        el = childElement;
                    }

                    //Add any element
                    XmlSchemaAny anyElement = new XmlSchemaAny();
                    anyElement.MinOccurs = 0;
                    anyElement.MaxOccurs = 1;
                    anyElement.ProcessContents = XmlSchemaContentProcessing.Lax;
                    anyElement.Parent = sequence;
                    sequence.Items.Add(anyElement);
                }
            }
        }
        return true;
    }

编译 Schema 的最终结果如下所示:

<?xml version=\"1.0\"?>
<xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"unqualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">
    <xs:element name=\"STEP\">
        <xs:complexType>
            <xs:sequence>    
                <xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"0002\" name=\"LFDNR\" type=\"xs:unsignedByte\" />      
                <xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"FUNKTIONSNUMMER\" />        
                <xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"Firmwareinformationen lesen\" name=\"FUNKTIONSNAME\" type=\"xs:string\" />    
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

感谢您的帮助! Br 马蒂亚斯

您的问题是由于您使用了 post 编译 属性。如帮助所示:

The particle for the content type. The post-compilation value of the ContentType particle.

一般来说,使用 .NET 的 SOM API 的一个提示是寻找也具有 setter 的属性。 "hint" 因为有些属性是:post 编译和用户可配置。

如果您的复杂类型的定义具有明确的内容模型(扩展或限制),那么您需要使用 XmlSchemaComplexType.ContentModel. If it's an XmlSchemaComplexContent, navigate its Content 属性(XmlSchemaComplexContentRestriction 或 XmlSchemaComplexContentExtension 之一);这些类型中的每一种都有一个粒子 属性,这是您可以修改的粒子。

否则,如果没有内容模型,只需访问 XmlSchemaComplexType.Particle

ContentTypeParticle 是 post 编译的 属性。只有 min-/max-Occurs 等属性可以修改。要添加新节点,如本例中的任何节点,必须修改 Particle-属性。在重新处理架构和重新编译 SchemaSet 之后,新元素将添加到 post-compiled ContentTypeParticle。 感谢@Petru-Gardea