2014-12-04 81 views
0

我從外部用戶提供的三(3)個XSD文件開始(一個XSD鏈接到另外兩個)。我使用xsd.exe工具通過運行以下命令來生成.NET對象:xsd.exe mof-simpleTypes.xsd mof-isp.xsd esf-submission.xsd /c並且它使用少量的部分對象生成了單個CS文件。從生成的對象生成XML文件

我創建了一個XmlSerializerNamespaces對象,並填入所需的名稱空間(兩個直接用於提供的示例XML文件以及另外兩個似乎未被引用的對象)。我已用以下方法成功生成的XML文件:

private XmlDocument ConvertEsfToXml(ESFSubmissionType type) 
{ 
    var xml = new XmlDocument(); 
    var serializer = new XmlSerializer(type.GetType()); 
    string result; 
    using (var writer = new Utf8StringWriter()) //override of StringWriter to force UTF-8 
    { 
     serializer.Serialize(writer, type, _namespaces); //_namespaces object holds all 4 namespaces 
     result = writer.ToString(); 
    } 
    xml.LoadXml(result); 
    return xml; 
} 

我說我面臨的問題是在所產生的CS文件,所述對象中的一個具有一個屬性(另一個產生的局部對象)的類型爲XmlElement。我已經成功構建了代碼中的對象,並且遇到了將對象轉換爲XmlElement的問題。我在這裏找到的問題和答案都是先將其轉換爲XmlDocument,然後再取DocumentElement屬性。此方法有效,但是返回的XML具有嵌入在該元件的命名空間,如下所示:

<esf:ESFSubmission xmlns:isp="http://www.for.gov.bc.ca/schema/isp" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:esf="http://www.for.gov.bc.ca/schema/esf"> 
    <esf:submissionMetadata> 
    <esf:emailAddress>[email protected]</esf:emailAddress> 
    <esf:telephoneNumber>1234567890</esf:telephoneNumber> 
    </esf:submissionMetadata> 
    <esf:submissionContent> 
    <isp:ISPSubmission xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:esf="http://www.for.gov.bc.ca/schema/esf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:isp="http://www.for.gov.bc.ca/schema/isp"> 
     <isp:ISPMillReport> 
     <isp:reportMonth>12</isp:reportMonth> 
     <isp:reportYear>2014</isp:reportYear> 
     <isp:reportComment>comment</isp:reportComment> 
     <isp:ISPLumberDetail> 
      <isp:species>FI</isp:species> 

注意:這僅僅是一個局部生成的XML文件(出於說明的目的)的。如您所見,每個XML節點都以名稱空間變量爲前綴。我的問題是:我如何在代碼中做到這一點?我的方法是否正確,如果是這樣,那麼如何不在ISPSubmission節點中包含名稱空間,或者如果有更好的方法來處理我忽略的這個問題,請提供見解。我期望的結果是將所有名稱空間定義放在文檔的頂部(它們的適當位置),而不是放在子元素上 - 以及如上所示在每個元素上維護名稱空間變量。

編輯(後reggaeguitar的評論)

這裏是爲我提供

<?xml version="1.0" encoding="UTF-8"?> 
<esf:ESFSubmission xmlns:esf="http://www.for.gov.bc.ca/schema/esf" 
    xmlns:isp="http://www.for.gov.bc.ca/schema/isp" xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.for.gov.bc.ca/schema/esf esf-submission.xsd 
         http://www.for.gov.bc.ca/schema/isp mof-isp.xsd"> 
    <esf:submissionMetadata> 
     <esf:emailAddress>mailto:[email protected]</esf:emailAddress> 
     <esf:telephoneNumber>6044445555</esf:telephoneNumber> 
    </esf:submissionMetadata> 
    <esf:submissionContent> 
     <isp:ISPSubmission> 
      <isp:ISPMillReport> 
       <isp:reportMonth>06</isp:reportMonth> 
       <isp:reportYear>2014</isp:reportYear> 
       <isp:reportComment>Up to 4000 characters is permitted for notes in this element.</isp:reportComment> 
       <isp:ISPLumberDetail> 
        <isp:species>FI</isp:species> 
        <isp:lumberGrade>EC</isp:lumberGrade> 
        <isp:gradeDescription/> 
        <isp:size>2x4</isp:size> 
        <isp:finishType/> 
        <isp:length>10</isp:length> 
        <isp:thickWidthUom>IN</isp:thickWidthUom> 
        <isp:volumeUnitOfMeasure>MBM</isp:volumeUnitOfMeasure> 
        <isp:volume>11543.987</isp:volume> 
        <isp:amount>1467893.98</isp:amount> 
        <isp:invoiceNumber>837261</isp:invoiceNumber> 
       </isp:ISPLumberDetail> 
       <isp:ISPLumberDetail> 
        <isp:species>CE</isp:species> 
        <isp:lumberGrade/> 
        <isp:gradeDescription/> 
        <isp:size/> 
        <isp:finishType>D</isp:finishType> 
        <isp:thickness>40</isp:thickness> 
        <isp:width>100</isp:width> 
        <isp:thickWidthUom>MM</isp:thickWidthUom> 
        <isp:volumeUnitOfMeasure>MBM</isp:volumeUnitOfMeasure> 
        <isp:volume>9743.987</isp:volume> 
        <isp:amount>1247893.98</isp:amount> 
        <isp:invoiceNumber/> 
       </isp:ISPLumberDetail> 
       <isp:ISPChipDetail> 
        <isp:species>CE</isp:species> 
        <isp:unitOfMeasure>BDT</isp:unitOfMeasure> 
        <isp:wholeLogInd>N</isp:wholeLogInd> 
        <isp:destinationCode>FBCO</isp:destinationCode> 
        <isp:destinationDescription/> 
        <isp:volume>563</isp:volume> 
        <isp:amount>54463</isp:amount> 
        <isp:invoiceNumber>12345679</isp:invoiceNumber> 
       </isp:ISPChipDetail> 
      </isp:ISPMillReport> 
      <isp:ISPSubmitter> 
       <isp:millNumber>103</isp:millNumber> 
       <isp:contactName>Dave Marotto</isp:contactName> 
       <isp:contactEmail>[email protected]</isp:contactEmail> 
       <isp:contactPhone>2507775555</isp:contactPhone> 
       <isp:contactPhoneExtension>1234</isp:contactPhoneExtension> 
      </isp:ISPSubmitter> 
     </isp:ISPSubmission> 
    </esf:submissionContent> 
</esf:ESFSubmission> 
+0

我不確定,但也許看看http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager%28v=vs.110%29.aspx和http:// msdn .microsoft.com/EN-US /庫/ d6730bwt%28V = vs.110%29.aspx – reggaeguitar 2014-12-04 19:39:48

回答

0

通過代碼做整個事情解決我的問題,甚至不使用xsd.exe生成示例XML文檔一個.NET對象。