从C#类代码生成XSD注释和文档标签

Pat*_*ick 6 c# xml xsd

使用xds.exe(或其他方法)从类生成XSD文件效果很好,但是我找不到将文档(或任何类型的描述)插入输出XSD的方法。

例如,C#类

public class Animal
{
    public int NumberOfLegs;
}
Run Code Online (Sandbox Code Playgroud)

生成XSD

<?xml version="1.0" encoding="utf-16"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Animal" nillable="true" type="Animal" />
  <xs:complexType name="Animal">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="NumberOfLegs" type="xs:int" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

但是我希望能够将XSD注释作为元数据添加到类中,因此XSD可以作为

<xs:complexType name="Animal">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" name="NumberOfLegs" type="xs:int">
      <xs:annotation>
        <xs:documentation>Will need to be greater than 0 to walk!</xs:documentation>
      </xs:annotation>
    </xs:element>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

在C#代码中是否有任何简洁的方法可以实现此目的?将任何种类的描述添加到xml元素/属性的任何方式都可以。批注必须在实际代码旁边,如下所示:

public class Animal
{
    [XmlAnnotation("Will need to be greater than 0 to walk!")]
    public int NumberOfLegs;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,需要从注释中自动记录下来。

jdw*_*eng 0

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication49
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);
            reader.ReadLine(); //skip the xml identification with utf-16 encoding
            XDocument doc = XDocument.Load(reader);

            XElement firstNode = (XElement)doc.FirstNode;
            XNamespace nsXs = firstNode.GetNamespaceOfPrefix("xs");

            XElement sequence = doc.Descendants(nsXs + "element").FirstOrDefault();

            sequence.Add(new XElement(nsXs + "annotation",
                new XElement(nsXs + "documention", "Will need to be greater than 0 to walk!")
                ));

        }
    }


}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,我的问题可能不够具体。注释需要与实际代码一起,我将更新问题。 (2认同)