首页 > 代码库 > xsd解析xml

xsd解析xml

下面讲述根据xml生成对应序列化反序列化类的过程,xml需要首先转化为xsd,然后再生成为实体类。其中,XSD是XML Schema Definition的缩写。

1.拥有一个xml文件

2.打开vs的command line:

  

 xsd *.xml ,执行这个命令 是通过xml文件生成xsd文件,xsd文件将生成在当前命令目录下。

xsd *.xsd /classes 是通过xsd文件生成xml的解析类,cs文件。示例顺便指定了命名空间为Test

 这样就可以把cs文件放到项目中去使用了,这个cs文件就是xml对应的解析类。

 

PS :xsd自动解析的文件不知道每个节点是不是唯一的还是有多个。如果需要指定某节点是唯一的,可以在生成xsd文件之后,把xsd文件放到vs中,

使用xml(Text) editor 方式打开,然后指定maxOccurs="1",这样就指定了当前节点为唯一一个了。maxOccurs="unbounded",表明xml节点可以有很多个。 这样再把修改的xsd使用xsd *.xsd /classes 命令生成cs文件,或许更满足你的需求。

 

3. 解析 xml 

        static void Main(string[] args)        {            try            {                XmlSerializer ser = new XmlSerializer(typeof(Response));                //读取xml进行解析                FileStream fs = new FileStream(@"D:\a.xml", FileMode.Open);                Response response = ser.Deserialize(fs) as Response;                response.SIP.Line1.Port = "9999";                fs.Close();                //修改xml并保存                fs = new FileStream(@"D:\a.xml", FileMode.Open, FileAccess.Write);                ser.Serialize(fs, response);                fs.Close();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }        }

  其中Response是我xml的首节点。

 

 

附加:

我的xml示例是:

<Response>  <APIVersion>1.0</APIVersion>  <Authenticated>true</Authenticated>  <Global>    <SoftwareUpgrade>      <Enabled>false</Enabled>      <Version/>      <URL/>      <Rule/>      <RetryInterval>3600</RetryInterval>    </SoftwareUpgrade>    <Provisioning>      <Enabled>true</Enabled>      <URL>https://eeee</URL>      <Interval>86400</Interval>    </Provisioning>    <Phonebook>      <Enabled>true</Enabled>      <URL>https://ffff</URL>    </Phonebook>  </Global>  <SIP>    <Line1>      <DisplayName>Terry Tang</DisplayName>      <URI>553870769</URI>      <PreferredURI>ever@abc.com</PreferredURI>      <AuthName>553870769</AuthName>      <Password>cJFZZjUsPU</Password>      <Transport>TCP</Transport>      <Mailbox>        123      </Mailbox>      <Port>5060</Port>      <Proxy>        <AutoMode>off</AutoMode>        <Proxy1>proxy.infocus.net</Proxy1>        <Proxy2/>      </Proxy>    </Line1>  </SIP></Response>