【问题标题】:Problems adding Any-Element to dynamically created XSD-Schema将 Any-Element 添加到动态创建的 XSD 架构时出现问题
【发布时间】:2016-03-12 02:27:54
【问题描述】:

我只想将一个 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-collection 中,就像您在示例代码末尾上方的几行中看到的那样。那是行不通的。在调试时,我可以看到 Items-collection 中的元素,但是在重新处理和重新编译 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>

感谢您的帮助! 马蒂亚斯兄弟

【问题讨论】:

    标签: c# xml xsd schema


    【解决方案1】:

    您的问题是由于您使用了后期编译属性。正如帮助所拥有的那样:

    内容类型的粒子。 ContentType 粒子的编译后值。

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

    如果您的复杂类型的定义有明确的内容模型(扩展或限制),那么您需要使用XmlSchemaComplexType.ContentModel。如果是XmlSchemaComplexContent,则导航其Content 属性(XmlSchemaComplexContentRestriction 或 XmlSchemaComplexContentExtension 之一);这些类型中的每一种都有一个 Particle 属性,这是您可以修改的。

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

    【讨论】:

    • 谢谢佩特鲁。我不关心 post 和 pre-compile 属性的使用!
    【解决方案2】:

    ContentTypeParticle 是一个后编译属性。只能修改一些属性,例如 min-/max-Occurs。要添加新节点,如本例中的任何节点,必须修改粒子属性。在重新处理模式和重新编译 SchemaSet 之后,新元素将被添加到后编译的 ContentTypeParticle。 感谢@Petru-Gardea

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多