代码之家  ›  专栏  ›  技术社区  ›  bug-a-lot

有什么方法可以使XML中的默认属性值在基于XSD模式的flex中得到解析?

  •  1
  • bug-a-lot  · 技术社区  · 15 年前

    我有一个带有XML模式的XML。XML模式定义了一个抽象复杂类型,该类型具有两个具有默认值的可选属性。然后我有几个复杂的类型来扩展基类型。最后是定义的类型的节点。 所以我加载XML,当分析每个节点时,可选属性根本不存在。 我试过在名称空间上开玩笑,甚至:

    XML.ignoreProcessingInstructions = false;
    

    运气不好。这家伙也经历过类似的事情 codingforums 但那就像5年前一样。我在火狐3.0.11上也遇到了同样的情况-显示的XML没有默认属性。 目前,我正在代码中设置默认值,但是否有一种方法可以从XML模式中获得这些值?

    示例XML架构:

    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myorg.org" xmlns:tns="http://www.myorg.org" elementFormDefault="qualified">
    <element name="config" type="tns:FieldsNode"></element>
    
    <complexType name="FieldsNode">
        <choice minOccurs="0" maxOccurs="unbounded">
            <element name="ImagePicker" type="tns:ImagePickerNode"
                maxOccurs="unbounded" minOccurs="0">
            </element>
        </choice>
    </complexType>
    
    <complexType name="FieldBase">
        <attribute use="required" name="id" type="string"></attribute>
        <attribute use="optional" default="true" name="mandatory"
            type="boolean">
        </attribute>
        <attribute default="3" name="colspan" type="int" use="optional"></attribute>
    </complexType>
    
    <complexType name="ImagePickerNode">
        <complexContent>
            <extension base="tns:FieldBase">
                <attribute name="maxWidth" type="int" use="required"></attribute>
                <attribute name="maxHeight" type="int" use="required"></attribute>
            </extension>
        </complexContent>
    </complexType>
    

    示例XML:

    <config xmlns="http://www.myorg.org"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.myorg.org test.xsd">
        <ImagePicker id="somePicker" maxHeight="10" maxWidth="12"/>
        <ImagePicker id="someOtherPicker" maxHeight="100" maxWidth="212" colspan="1" mandatory="false"/> 
    </config>
    

    编辑:添加了示例XML和架构。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Marcus Stade Quentin    15 年前

    实际上,有可能,这个人在flex框架中编写了如何使用xmlcoder和xmlcoder类来基于模式解析/写入XML:

    http://blog.misprintt.net/?p=181

    http://blog.misprintt.net/?p=192

    示例应用程序同时显示解析和写入: http://misprintt.net/examples/xmlSchema/

    但是,应该注意的是,这些类中有几个错误,这些错误可能或可能不会为您的特定应用程序造成问题。如果我正确地回忆起来,其中一个参数直接与模式中具有默认值的可选参数相关。在某些(或可能全部)实例中,从未设置默认值。然而,一旦你发现编码器/解码器类中的问题所在,这些错误通常很容易修复(因为这几乎总是这两个类)。由于这些类具有高度递归性,因此很难发现错误,但是对于较小的模式(以及随后的XML文件),这并不真正困难。

    但是,您仍然需要为相应的模式类型创建actionscript类型。这可以通过让xmlcoder输出一个匿名对象的结果,然后将该对象序列化为JSON格式或直接作为类格式来自动完成。但是,除非所有属性和元素都存在于XML中,否则您将错过一些属性。还有这个项目,我还没有评估: http://www.graniteds.org/confluence/display/DOC/2.+Gas3+Code+Generator

    据说它将Java bean转换为AS3,而模式到Java bean转换器现在是一毛钱。

    希望它有帮助!

        2
  •  1
  •   Community CDub    7 年前

    最近偶然发现了以下主题: Validate Xml in Flex3 Air

    答案就在这里 Gregor Kiddie 也可以回答我的问题。根据上述答案,基本上需要注意两个链接:

    XML & XSD 1

    XML & XSD 2

        3
  •  0
  •   Jacob    15 年前

    我不知道有什么XML库可以将基于模式的默认属性插入到XML文件的DOM中。当然,flex没有这样做。我认为模式中指定的默认值实际上更多地意味着作为工具的文档,例如那些生成XML可序列化类的文档。