-2


我想为 String 创建 XMLSchema ,

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

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

因为我们有上述字符串的静态模式将是

@"<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>"

如果我向字符串 Parameter 添加更多元素。如何在运行时生成 Schema?

4

1 回答 1

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());
        }
    }
}
于 2013-08-05T07:53:51.237 回答