XSD和纯文本

XSD和纯文本,xsd,Xsd,我有一个rest/xml服务,它提供了以下内容 <verse-unit unit-id="38009001"> <marker class="begin-verse" mid="v38009001"/> <begin-chapter num="9"/><heading>Judgment on Israel&apos;s Enemies</heading> <begin-block-indent/&g

我有一个rest/xml服务,它提供了以下内容

<verse-unit unit-id="38009001">
    <marker class="begin-verse" mid="v38009001"/>
    <begin-chapter num="9"/><heading>Judgment on Israel&apos;s Enemies</heading>
    <begin-block-indent/>
    <begin-paragraph class="line-group"/>
    <begin-line/><verse-num begin-chapter="9">1</verse-num>The burden of the word of the <span class="divine-name">Lord</span> is against the land of Hadrach<end-line class="br"/>
    <begin-line class="indent"/>and Damascus is its resting place.<end-line class="br"/>
    <begin-line/>For the <span class="divine-name">Lord</span> has an eye on mankind<end-line class="br"/>
    <begin-line class="indent"/>and on all the tribes of Israel,<footnote id="f1">
        A slight emendation yields <i>
            For to the <span class="divine-name">Lord</span> belongs the capital of Syria and all the tribes of Israel
        </i>
    </footnote><end-line class="br"/>
</verse-unit>

对以色列的判决&apos;敌人
耶和华的话的重担临到哈得拉地
大马士革是它的安息之地。
因为耶和华看顾人
论到以色列各支派,
稍加修改就会产生结果
因为亚兰的京城和以色列各支派都属耶和华
我使用VisualStudio从中生成一个模式,并使用XSD.EXE生成类,我可以使用这些类将这个混乱反序列化为可编程的东西

我得到了一切工作,它是反序列化完美(几乎)

我遇到的问题是,在整个子节点中混合了随机文本。生成的verse unit对象为我提供了一个对象列表(开始行、开始块缩进等),以及另一个表示整个xml中字符串位的字符串对象列表

这是我的模式

<xs:element maxOccurs="unbounded" name="verse-unit">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="marker">
                    <xs:complexType>
                        <xs:attribute name="class" type="xs:string" use="required" />
                        <xs:attribute name="mid" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="begin-chapter">
                    <xs:complexType>
                        <xs:attribute name="num" type="xs:unsignedByte" use="required" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="heading">
                    <xs:complexType mixed="true">
                        <xs:sequence minOccurs="0">
                            <xs:element name="span">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="class" type="xs:string" use="required" />
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="begin-block-indent" />
                <xs:element name="begin-paragraph">
                    <xs:complexType>
                        <xs:attribute name="class" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="begin-line">
                    <xs:complexType>
                        <xs:attribute name="class" type="xs:string" use="optional" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="verse-num">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:unsignedByte">
                                <xs:attribute name="begin-chapter" type="xs:unsignedByte" use="optional" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="end-line">
                    <xs:complexType>
                        <xs:attribute name="class" type="xs:string" use="optional" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="end-paragraph" />
                <xs:element name="end-block-indent" />
                <xs:element name="end-chapter" />
            </xs:choice>
        </xs:sequence>
        <xs:attribute name="unit-id" type="xs:unsignedInt" use="required" />
    </xs:complexType>
</xs:element>

我需要的是这个。我需要一个对象来表示没有被xml节点包围的随机文本,以便我知道所有内容的顺序

我知道这很复杂,所以让我试着简化一下


我肯定你不想要一些文字。
一些文本。
更多您不想要的文本。


我需要xsd生成一个字段对象,其中的项可以是文本对象,也可以是子字段对象。我需要知道随机文本在子节点中的位置。

您的问题从这里开始:

<xs:element name="begin-line">
    <xs:complexType>
        <xs:attribute name="class" type="xs:string" use="optional" />
    </xs:complexType>
</xs:element>

这意味着“begin line”类型有一个名为class的属性(这意味着标记可以有一个像这样的属性类:
。但是它只是一个类型
xs:string
,这意味着您得到的只是一个字符串

我也不知道这是否是一个选项,但您的XML是否可以被设置为具有结束标记,例如以下行:
大马士革是它的安息之地。

XML应该是这样的:
大马士革是它的安息之地。

我相信,如果所有的“行”标记都被正确关闭,那么XSD生成器可能会有更好的时间尝试导出“开始行”中的内容XML标记。如果这是可能的,那么您可以将
开始行
重命名为
,并将
开始章节
重命名为
章节
,这将使您的XML更具可读性

如果无法更新您的代码,那么您必须尽最大努力处理字符串本身。我不确定诗句是否包含纯HTML,但如果是这样,您可以将
开始行
元素中的字符串解析为XML本身,使用库在值和节点之间跳转(在尝试解析字符串之前,您可能需要在字符串周围包装一对标记)


祝您好运:)

您可以尝试Xml模式混合内容,这里有很好的解释:


我对.net方面不太了解。但这篇稍旧的文章说xsd.exe基本上支持混合模式:

不幸的是,我必须处理这个xml,没有办法解决它。在反序列化它之前,你觉得用一些正则表达式字符串替换xml的魔力怎么样?我正在考虑关闭所有的自动关闭标记打开标记,然后将所有标记转换为标记。您认为如何?这可能需要一段时间,具体取决于您的XML样本有多大。