2010-05-25 109 views
0

我自动从下面的xml生成一个xsd文件,并使用xsd2code来获得一个c#类。问题是整个XML不反序列化。反序列化xml文件的问题

这里是我正在试图反序列化:

static void Main(string[] args) 
    { 
     using (TextReader textReader = new StreamReader("config.xml")) 
     { 
      // string temp = textReader.ReadToEnd(); 
      XmlSerializer deserializer = new XmlSerializer(typeof(project)); 
      project p = (project)deserializer.Deserialize(textReader); 
     } 
    } 

这里是实际的XML:

<?xml version='1.0' encoding='UTF-8'?> 
<project> 
    <scm class="hudson.scm.SubversionSCM"> 
    <locations> 
     <hudson.scm.SubversionSCM_-ModuleLocation> 
     <remote>https://svn.xxx.com/test/Validation/CPS DRTest DLL/trunk</remote> 
     </hudson.scm.SubversionSCM_-ModuleLocation> 
    </locations> 
    <useUpdate>false</useUpdate> 
    <browser class="hudson.scm.browsers.FishEyeSVN"> 
     <url>http://fisheye.xxxx.net/browse/Test/</url> 
     <rootModule>Test</rootModule> 
    </browser> 
    <excludedCommitMessages></excludedCommitMessages> 
    </scm> 
    <openf>Hello there</openf> 
    <buildWrappers/> 
</project> 

当我运行上面,位置节点保持为空。

下面是我使用的XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="project"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="openf" type="xs:string" minOccurs="0" /> 
     <xs:element name="buildWrappers" type="xs:string" minOccurs="0" /> 
     <xs:element name="scm" minOccurs="0"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="useUpdate" type="xs:string" minOccurs="0" msdata:Ordinal="1" /> 
       <xs:element name="excludedCommitMessages" type="xs:string" minOccurs="0" msdata:Ordinal="2" /> 
       <xs:element name="locations" minOccurs="0"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="hudson.scm.SubversionSCM_-ModuleLocation" minOccurs="0"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="remote" type="xs:string" minOccurs="0" /> 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="browser" minOccurs="0"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="url" type="xs:string" minOccurs="0" msdata:Ordinal="0" /> 
        <xs:element name="rootModule" type="xs:string" minOccurs="0" msdata:Ordinal="1" /> 
        </xs:sequence> 
        <xs:attribute name="class" type="xs:string" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="class" type="xs:string" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="project" /> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

回答

1

想通了。当使用xsd2code时,我选择了选项来定位3.5框架并包含xml属性。它现在按预期反序列化。不知道哪一个做了,但现在有效。

0

根据this page ''不是有效的XML标记名称字符,因此您需要将<hudson.scm.SubversionSCM_-ModuleLocation>重命名为没有点的东西。

+1

这应该不是问题。 XML名称内的点很好。它们都包含在XML 1.0和XML 1.1建议中的生产[4a]中。你不能做的是用一个点开始一个名字。 – 2010-05-25 18:45:59