मैं इस कोड कण द्वारा निर्मित एक मौजूदा 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-स्कीमासेट बनाने के बाद कुछ हिस्सों को संशोधित किया है। निम्नलिखित कोड मौजूदा तत्वों के न्यूनतम और अधिकतम-गुण को सेट करता है जो ठीक भी काम करता है। विशेषताओं के संशोधन के बाद मुझे XmlSchemaElement का एक तत्व प्रकार XmlSchemaSequence के संग्रह में भी जोड़ना होगा, जैसे आप नमूना कोड के अंत में कुछ लाइनों में देखते हैं। वह काम नहीं करता। डीबगिंग के दौरान मैं आइटम को आइटम-संग्रह के भीतर देख सकता हूं, लेकिन स्कीमासेट की पुनर्संरचना और पुन: संयोजन के बाद संशोधित विशेषताओं को बहुत अच्छी तरह से सेट किया गया है, लेकिन उत्पन्न कोई भी तत्व मौजूद नहीं है जैसे आप अंतिम परिणाम के संदेश बॉक्स में देखते हैं। क्या कोई मदद कर सकता है?

  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;
    }

संकलित स्कीमा का अंतिम परिणाम इस प्रकार है:

<?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 मथायस

2
MDo 7 पद 2015, 16:08

2 जवाब

सबसे बढ़िया उत्तर

आपकी समस्या पोस्ट संकलन संपत्ति के आपके उपयोग के कारण है। मदद के रूप में यह है:

सामग्री प्रकार के लिए कण। ContentType कण का पोस्ट-संकलन मूल्य।

सामान्य तौर पर, .NET के SOM API का उपयोग करने में एक संकेत उन गुणों की तलाश करना है जिनके पास एक सेटर भी है। "संकेत" कुछ गुण हैं क्योंकि दोनों हैं: पोस्ट संकलन, और उपयोगकर्ता कॉन्फ़िगर करने योग्य।

यदि आपके जटिल प्रकार की परिभाषा में एक स्पष्ट सामग्री मॉडल (विस्तार या प्रतिबंध) है, तो आपको XmlSchemaComplexType.ContentModel। यदि यह एक XmlSchemaComplexContent , इसका सामग्री संपत्ति (XmlSchemaComplexContentRestriction या XmlSchemaComplexContentExtension में से एक); इनमें से प्रत्येक प्रकार में एक कण गुण होता है, जिसे आप संशोधित कर सकते हैं।

अन्यथा, यदि कोई सामग्री मॉडल नहीं है, तो बस XmlSchemaComplexType.Particle

1
Petru Gardea 7 पद 2015, 14:35

ContentTypeParticle एक पोस्ट-संकलित संपत्ति है। केवल कुछ विशेषताओं जैसे- मिनट / अधिकतम-को संशोधित किया जा सकता है। नए नोड्स जोड़ने के लिए, इस मामले में किसी भी नोड की तरह, कण-संपत्ति को संशोधित किया जाना चाहिए। स्कीमा को पुन: प्रस्तुत करने और स्कीमासेट के पुन: संयोजन के बाद नया तत्व पोस्ट-संकलित ContentTypeParticle में जोड़ा जाएगा। @ पेट्रु-गार्डिया को धन्यवाद

0
MDo 14 पद 2015, 07:18