XSD类生成嵌套表问题

发布于 2024-07-10 13:24:54 字数 2263 浏览 7 评论 0原文

目前,我在从具有重复元素的 xsd 生成类文件时遇到问题。 我正在使用 VS2005 SP1 中的自定义工具“MsDatasetGenerator”,从 c# 的 xsd 创建类型化数据集。 我正在尝试通过此模式解析 xml

    <?xml version="1.0" encoding=\"utf-8\"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="order">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="contact">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string" />
                            <xs:element name="phone" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="buyer">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="contact">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string" />
                                        <xs:element name="phone" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但出现以下错误“同一个表 'contact' 不能是两个嵌套关系中的子表。

XSD 编译正确,但它是类型化数据集无法处理重复表。 现在我还测试了 xsd.exe 工具,但它似乎生成与 msdatasetgenerator 相同的代码。 我还尝试了一些第三方代码生成器工具,例如 XSD2Code、CodeXS、AltovaXmlSpy,但我也无法让它与嵌套元素一起使用。

或者,我可以通过输入和输出处的 xslt 转换来解决问题,但这会降低我的性能。

所以现在我问是否有人可以帮助我为 VS2005 提供一个好的解决方案,或者知道可以处理这个问题的好的 xsd 类生成器。 如果它作为数组或列表工作,它不必是类型化数据集,只要易于序列化和反序列化它也是完美的。

提前致谢 弗雷格尔

Currently I'm having a problem with generating class files from a xsd with repeating elements. I’m using the custom tool ‘MsDatasetGenerator’ in VS2005 SP1 witch create a typed dataset from the xsd for c#. I’m trying to parse the xml by this schema

    <?xml version="1.0" encoding=\"utf-8\"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="order">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="contact">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string" />
                            <xs:element name="phone" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="buyer">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="contact">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string" />
                                        <xs:element name="phone" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

But I get following error “The same table 'contact' cannot be the child table in two nested relations.

The XSD compiles correctly but it’s the typed dataset that can’t handle repeating tables. Now I have tested also the xsd.exe tool but it seems to generate the same code as the msdatasetgenerator. I also tried some third party code generator tools like XSD2Code, CodeXS, AltovaXmlSpy but also I can’t get it to work with nested elements.

Alternatively I could solve the problem with xslt transformation at the input and the output but it would cost me a lot of performance.

So now I’m asking if someone could help me with a good solution for VS2005, or know good xsd class generator that can handle this problem. It doesn’t have to be a typed dataset if it works as an array or a list it is also perfect as long it is easy to serializing and deserializing it.

Thanks in advance
Freggel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无戏配角 2024-07-17 13:24:54

我遇到了同样的问题..如果性能不是问题,您可以使用 XSLT 重命名具有相同名称的“子”表(即结果名称是表名称及其父表名称的串联):

 ...
  <xsl:template match="*">
     <xsl:param name="parentElm">
       <xsl:value-of select="name(..)" />
     </xsl:param>
     <xsl:choose>
       <xsl:when test="local-name() = 'Contact'">
         <xsl:element name="{concat('Contact',$parentElm)}">
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:when> <xsl:otherwise>
         <xsl:element name="{local-name()}">
           <xsl:copy-of select="@*" />
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:otherwise>
     </xsl:choose>   </xsl:template> ...

I had the same problem.. if performances are not an issue, you can use XSLT to rename the "child" tables that have the same name, (i.e. the resulting name is the concatenation of table name and its parent):

 ...
  <xsl:template match="*">
     <xsl:param name="parentElm">
       <xsl:value-of select="name(..)" />
     </xsl:param>
     <xsl:choose>
       <xsl:when test="local-name() = 'Contact'">
         <xsl:element name="{concat('Contact',$parentElm)}">
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:when> <xsl:otherwise>
         <xsl:element name="{local-name()}">
           <xsl:copy-of select="@*" />
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:otherwise>
     </xsl:choose>   </xsl:template> ...
倾听心声的旋律 2024-07-17 13:24:54

我建议对模式项进行简单的重命名,并使用分组(如下所示)或 xsd 包含(如果您需要这种复杂类型用于其他模式)。 如果您对名称没有硬性要求,这应该可以解决问题。

根据经验,我认为工具可能无法处理您示例中的重复命名。

像这样的事情可能会起作用:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:group name="Contact">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="phone" type="xs:string" />
    </xs:sequence>
  </xs:group>
  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderContact">
          <xs:complexType>
            <xs:sequence>
              <xs:group ref="Contact"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="buyer">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BuyerContact">
                <xs:complexType>
                  <xs:sequence>
                    <xs:group ref="Contact"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

I would suggest a simple renaming of the schema items, plus the usage of grouping (shown below) or xsd includes (if you need this complex type for other schemas). This should solve to problem if you have no hard requirment on the names.

From experience, I don't think may tools will work with the repeated naming in your example.

Something like this may do the trick:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:group name="Contact">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="phone" type="xs:string" />
    </xs:sequence>
  </xs:group>
  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderContact">
          <xs:complexType>
            <xs:sequence>
              <xs:group ref="Contact"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="buyer">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BuyerContact">
                <xs:complexType>
                  <xs:sequence>
                    <xs:group ref="Contact"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
万人眼中万个我 2024-07-17 13:24:54

也许您可以使用 xsd:import / xsd:include 将 xsd 拆分为多个文件,然后使用 xsd.exe 编译每个文件。 我认为您可以指定使用 xsd.exe 时生成代码的命名空间。

几年前,我致力于从 xsd:sa 生成类,出于某种原因,我决定使用 xsdobjgen.exe 而不是 xsd.exe。

祝你好运!

Maybe you can use the xsd:import / xsd:include to split the xsd into several files, then use xsd.exe to compile each. I think you can specify the namespace to generate the code to when working with xsd.exe.

I worked with generating classes from xsd:s a couple of years ago, and for some reason I decided on using xsdobjgen.exe instead of xsd.exe.

Good luck!

£烟消云散 2024-07-17 13:24:54

看看我对这个项目的解决方案。

相同表“name”不能是两个嵌套关系中的子表

我建议在架构中使用“ref”来引用“重复”元素。

Look at my solution for this item.

The same table 'name' cannot be the child table in two nested relations

I suggest using 'ref' in your schema to refer to the 'duplicate' elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文