为String创建XMLSchema

时间:2013-08-05 06:57:39

标签: c#


我想为String创建XMLSchema,

     String parameter="<root><HostName>Arasanalu</HostName><AdminUserName>Administrator</AdminUserName>
<AdminPassword>A1234</AdminPassword><PlaceNumber>38</PlaceNumber></root>"

我们可以自动添加更多元素。然后如何创建XMLSchema。

因为我们有上面字符串的静态Schema将是

@"<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""root"">
    <xs:complexType>
      <xs:sequence>
        <xs:element name=""HostName"" type=""xs:string"" />
        <xs:element name=""AdminUserName"" type=""xs:string"" />
        <xs:element name=""AdminPassword"" type=""xs:string"" />
        <xs:element name=""PlaceNumber"" type=""xs:positiveInteger"" />
      </xs:sequence>
    </xs:complexType>
</xs:element></xs:schema>"

如果我在字符串参数中添加更多元素。如何在运行中生成架构?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用DataSet阅读它,编写架构并最后调整一下XML结构。

class Program
{
    const string
        MinOccurs = "minOccurs",
        Element = "element",
        LocalName = "xs";

    static void Main(string[] args)
    {
        String parameter =
            @"<HostName>Arasanalu</HostName>
              <AdminUserName>Administrator</AdminUserName>
              <AdminPassword>A1234</AdminPassword>
              <PlaceNumber>38</PlaceNumber>";
        var ds = new DataSet();
        ds.ReadXml(new StringReader("<root>" + parameter + "</root>"));
        var sb = new StringBuilder();
        using (var w = new StringWriter(sb))
        {
            ds.WriteXmlSchema(w);

        var doc = XDocument.Parse(sb.ToString());
        doc.Root.LastNode.Remove();
        doc.Root.Attributes()
            .Where(a => a.Name.LocalName != LocalName).Remove();
        doc.Descendants(XName.Get(Element, 
            doc.Root.GetNamespaceOfPrefix(LocalName).NamespaceName))
            .ToList()
            .ForEach(e =>
            {
                var minOccurs = e.Attribute(XName.Get(MinOccurs));
                if (minOccurs != null)
                    minOccurs.Remove();
            });
        sb.Clear();
        doc.Save(w);
        Console.WriteLine(sb.ToString());
        }
    }
}