【问题标题】:Generate XML File From Generated Object从生成的对象生成 XML 文件
【发布时间】:2014-12-04 18:39:27
【问题描述】:

我从外部提供的三 (3) 个 XSD 文件开始(一个 XSD 链接到另外两个)。我使用 xsd.exe 工具通过运行以下命令生成一个 .NET 对象:xsd.exe mof-simpleTypes.xsd mof-isp.xsd esf-submission.xsd /c,它生成了一个带有少量部分对象的单个 CS 文件。

我创建了一个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>test@test.com</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 节点中包含命名空间,或者如果有更好的方法来解决我忽略的这个问题,请提供见解。我想要的结果是将所有命名空间定义放在文档的顶部(它们的适当位置)而不是子元素 - 以及在每个元素上维护命名空间变量,如上所示。

编辑(在雷鬼吉他评论之后)

这是我提供的示例 XML 文档

<?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:eric.murphy@cgi.com</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>eric.murphy@cgi.com</isp:contactEmail>
                <isp:contactPhone>2507775555</isp:contactPhone>
                <isp:contactPhoneExtension>1234</isp:contactPhoneExtension>
            </isp:ISPSubmitter>
        </isp:ISPSubmission>
    </esf:submissionContent>
</esf:ESFSubmission>

【问题讨论】:

标签: c# .net xml namespaces xsd


【解决方案1】:

通过在代码中完成整个事情,甚至不使用 xsd.exe 来生成 .NET 对象,解决了我的问题。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2011-10-05
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多