2012-05-24 53 views
8

Tôi có một số tệp DTD lớn. Tôi đã sử dụng trang để chuyển đổi chúng thành các tệp XSD, vì vậy tôi có thể dễ dàng sử dụng nó từ JAXB và các tiện ích khác. Tuy nhiên, tệp XSD được tạo ra có tất cả các phần tử được khai báo ở cấp cao nhất. Nó có nghĩa là bất kỳ phần tử nào cũng có thể là phần tử gốc của một XML đầu vào. Tôi muốn chỉ định một phần tử cụ thể.Chuyển đổi DTD thành XSD với phần tử gốc (bắt đầu) đã xác định

Việc có nhiều yếu tố gốc này gây ra một số vấn đề, ví dụ: xjc tạo ra @XmlRootElement cho tất cả các lớp, vì vậy tôi cần thêm các kiểm tra bổ sung.

Theo tôi được biết, tôi cần phải viết lại XSD tạo, di chuyển <xs:element> s để <xs:complexType> s, thay đổi element ref s vào element type s và như vậy, nhưng điều này sẽ là quá nhiều việc khỉ, không có cách nào để xác minh nếu tất cả thực hiện đúng.

Có cách nào hiệu quả hơn để thực hiện việc này không?

+0

+1 cho một câu hỏi hợp lý, nhưng chúng ta cũng cần nói rõ rằng DTD để chuyển đổi XSD luôn chỉ là gần đúng. –

+0

@JirkaHanika Khi tôi hiểu XSD được tạo ra xấp xỉ một DTD rất tốt. Ngoại trừ DOCTYPE định nghĩa (không có bất ngờ mặc dù) và một số công cụ không gian tên. Ngoài ra một số cấu trúc DTD lạ không thể chuyển đổi thành XSD một cách gọn gàng. Vấn đề duy nhất tôi đang phải đối mặt vào lúc này, rằng DTD không định nghĩa khái niệm của phần tử gốc. (RelaxNG xác định nó với '', nhưng nó được hỗ trợ kém, 'xjc' không thành công với nó). – kan

+0

Có nhưng không gian tên là một biggie.Ngoài ra rất nhiều cấu trúc được đặt tên tương tự, có nghĩa là những thứ khá khác nhau. +1 cho câu trả lời đầu tiên bởi vì nó không giả vờ bất kỳ ngữ nghĩa XSD nào. –

Trả lời

0

Tôi đã sử dụng biến dạng XSLT đơn giản để xử lý XSD được tạo. Hoạt động tốt cho trường hợp của tôi:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     > 
    <xsl:template match="@*|node()|comment()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()|comment()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="xs:element/@ref"/> 
    <xsl:template match="xs:element[@ref]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:attribute name="type"><xsl:value-of select="@ref"/></xsl:attribute> 
      <xsl:attribute name="name"><xsl:value-of select="@ref"/></xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="xs:element[@name = //xs:element/@ref and xs:complexType]"> 
     <xs:complexType name="{@name}"> 
      <xsl:apply-templates select="xs:complexType/node()"/> 
     </xs:complexType> 
    </xsl:template> 
    <xsl:template match="xs:element[@name = //xs:element/@ref and @type]"> 
     <xsl:choose> 
      <xsl:when test="//xs:complexType[@name = current()/@type]"> 
       <xs:complexType name="{@name}"> 
        <xs:complexContent> 
         <xs:extension base="{@type}"/> 
        </xs:complexContent> 
       </xs:complexType> 
      </xsl:when> 
      <xsl:otherwise> 
       <xs:simpleType name="{@name}"> 
        <xs:restriction base="{@type}"/> 
       </xs:simpleType> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Phát hiện định nghĩa phần tử tham chiếu và biến chúng thành comptexType s, thay đổi thay đổi. Tất cả các yếu tố không được tham chiếu trở thành các phần tử bắt đầu.

0

Từ những gì bạn mô tả và bỏ qua "độ trung thực" của chuyển đổi như được chỉ ra trong một số nhận xét, tôi chỉ xử lý thực tế là bạn đang tìm kiếm một số cách tự động gọi) Tái cấu trúc lược đồ XML. Tôi liên kết với QTAssistant, một sản phẩm dành cho loại công việc này, vì vậy đây là cách tôi sẽ làm ...

Một điều bạn phải làm bằng tay, cho dù là gì, là tìm ra và nắm bắt danh sách các phần tử bạn muốn xem dưới dạng root (hoặc không) ... và bạn đã hoàn thành: nhấn một nút, hoặc gọi một dòng lệnh, và bạn sẽ biết chắc chắn nếu một XSD hợp lệ được tạo ra.

Công cụ tái cấu trúc sử dụng mẫu khách truy cập trong trường hợp của bạn về cơ bản thực hiện những gì bạn cần: tạo các loại toàn cầu khi cần, loại bỏ các định nghĩa phần tử toàn cầu không mong muốn và thay thế bất kỳ phần tử được refed nào bằng khai báo nội tuyến.

(Đối với bất kỳ ai đọc điều này biết nhóm thay thế, việc tái cấu trúc này không thay thế tham chiếu đến người đứng đầu nhóm thay thế; vì chúng ta đang nói về XSD từ DTD, đây không phải là vấn đề ở đây).

Sự đơn giản này và thực tế là có thể lặp lại và đáng tin cậy, sẽ là những lợi thế chính của việc sử dụng công cụ tái cấu trúc chuyên dụng; một ưu điểm khác: nó cũng có thể gán lại không gian tên xml, dù sao bạn muốn ...

Nếu bạn quan tâm đến nhiều chi tiết hơn, hãy cho tôi biết và tôi sẽ cập nhật bài đăng này với một mẫu nhỏ và một số minh họa.

Các vấn đề liên quan