Unmarshal xhtml в виде строки с использованием xsd - PullRequest
1 голос
/ 21 января 2012

Я пытаюсь распаковать большой документ xhtml, используя XSD и jaxb. У меня все работает, кроме одной части, которая содержит чистый HTML. Вот пример xhtml, который я получаю (я могу захватить каждый элемент, кроме «контента»):

<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">...</title>
<id>...</id>
<updated>...</updated>
<entry>
    <id>...</id>
    <title type="text">...</title>
    <updated>...</updated>
    <author>
        <name>...</name>
    </author>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
        <div>{html...}<div>{html...}</div>/<div>/<div>
    </content>
</entry>
</feed>

Вот расширение файла xsd:

<xsd:complexType name="ApCategoriesJAXB" >
    <xsd:sequence>
        <xsd:element name="id" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="title" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="updated" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="link" type="tns:ApLinkJAXB" minOccurs="0"></xsd:element>
        <xsd:element name="entry" type="tns:ApEntryJAXB" minOccurs="0" maxOccurs="unbounded"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ApEntryJAXB">
    <xsd:sequence>
        <xsd:element name="id" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="name" type="xsd:string" minOccurs="0"></xsd:element>
        <xsd:element name="title" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="updated" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
        <xsd:element name="author" type="tns:ApAuthorJAXB" minOccurs="0"></xsd:element>  
        <xsd:element name="link" type="tns:ApLinkJAXB" minOccurs="0"></xsd:element>
        <xsd:element name="category" type="tns:ApCategoryJAXB" minOccurs="0"></xsd:element>  
        <xsd:element name="content" type="tns:ApContentJAXB" minOccurs="0"></xsd:element>            
    </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ApCategoryJAXB" >
    <xsd:sequence></xsd:sequence>
    <xsd:attribute name="term" type="xsd:string" />
    <xsd:attribute name="label" type="xsd:string" />
    <xsd:attribute name="scheme" type="xsd:string" />
</xsd:complexType>

<xsd:complexType name="ApContentJAXB" >
    <xsd:sequence>
        <xsd:element name="div" type="tns:ApDivJAXB" minOccurs="0" maxOccurs="unbounded"></xsd:element>
    </xsd:sequence>
</xsd:complexType>    

<xsd:complexType name="ApDivJAXB" >
    <xsd:sequence>
        <xsd:any namespace="http://www.w3.org/2005/Atom" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>

Я пробовал каждую комбинацию вложенных элементов xsd, complexTypes, xsd: any и т. Д. И т. Д., И я не могу получить это значение «содержимого», независимо от того, что я пытаюсь. Я с радостью воспринимаю все html как строки или разбираю их в объекте.

Заранее спасибо за любые мысли.

** Я отредактировал часть xsd, чтобы включить соответствующие части. Я попытался как вложить элемент «any» в «div» complexType, как было показано, так и пропустить «div» complexType ».

Еще раз спасибо.

1 Ответ

0 голосов
/ 21 января 2012

Если вы хотите, чтобы <content> имел тип xsd:string, вам нужно кодировать или иным образом экранировать HTML. Вы можете использовать разделы CDATA, кодирование Base64 или экранировать все сущности (например, от < до &lt; и т. Д.).

В противном случае xsd:any должно работать. Можете ли вы предоставить более полный пример вашего XSD, когда вы попробовали это?

...