2013-05-15 26 views
5

Tôi muốn hợp nhất 2 tệp XML với cùng một cấu trúc để tạo một. Ví dụ;Cách sử dụng xpointer với Xinclude để tham chiếu các phần tử

Test1.xml

<?xml version="1.0" encoding="UTF-8"?> 

<ns:Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:TestNamespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <ns:element1 id="001"> 
     <ns:element2 id="001.1" order="1"> 
      <ns:element3 id="001.1.1" /> 
     </ns:element2> 
     <ns:element2 id="001.2" order="2"> 
      <ns:element3 id="001.1.2" /> 
     </ns:element2> 
    </ns:element1> 
</ns:Root> 

Test2.xml

<?xml version="1.0" encoding="UTF-8"?> 

<ns:Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:TestNamespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <ns:element1 id="999"> 
     <ns:element2 id="999.1" order="1"> 
      <ns:element3 id="999.1.1" /> 
     </ns:element2> 
    </ns:element1> 
</ns:Root> 

Để tạo

TestOutput.xml

<?xml version="1.0" encoding="UTF-8"?> 

<ns:Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:TestNamespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <ns:element1 id="001"> 
     <ns:element2 id="001.1" order="1"> 
      <ns:element3 id="001.1.1" /> 
     </ns:element2> 
     <ns:element2 id="001.2" order="2"> 
      <ns:element3 id="001.1.2" /> 
     </ns:element2> 
    </ns:element1> 
    <ns:element1 id="999"> 
     <ns:element2 id="999.1" order="1"> 
      <ns:element3 id="999.1.1" /> 
     </ns:element2> 
    </ns:element1> 
</ns:Root> 

tức là một tệp XML có tất cả các phần tử từ mỗi phần tử được bao gồm.

Tôi đã tìm thấy câu hỏi hữu ích trên StackOverflow và đã đưa ra điều này;

Merge.xml

<?xml version="1.0"?> 

<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:TestNamespace"> 

    <xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" /> 

    <xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" /> 

</ns:Root> 

Mà tôi chạy bằng cách làm này (tôi cần phải sử dụng xmllint vì những lý do để tham gia đi vào)

xmllint -xinclude Merge.xml

Nhưng điều này không hoạt động, nó than phiền về các thiong khác nhau, có vẻ liên quan đến xpointer.

parser error : warning: ChildSeq not starting by /1 
Merge.xml:7: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1) 
Merge.xml:7: element include: XInclude error : could not load Test1.xml, and no fallback was found 
parser error : warning: ChildSeq not starting by /1 
Merge.xml:9: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1) 
Merge.xml:9: element include: XInclude error : could not load Test2.xml, and no fallback was found 
<?xml version="1.0"?> 
<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="urn:TestNamespace"> 

    <xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/> 

    <xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/> 

</ns:Root> 

Nếu tôi bỏ qua các thuộc tính XPointer trong Merge.xml sau đó tôi nhận được một số lượng hợp lý, nhưng nó đã làm hơn bao gồm các yếu tố tôi muốn tất nhiên.

Ai đó có thể cung cấp một số lời khuyên về những gì tôi đang làm sai với xpointer xin vui lòng?

Cảm ơn antcipation.

+0

Nếu tôi loại bỏ không gian tên, các công trình trên, vì vậy đây chỉ là vấn đề với XPointer và cách tôi xử lý các không gian tên – Nerdio

+0

Lược đồ 'element()' không hỗ trợ tên đủ điều kiện (xem https: // www.w3.org/TR/xptr-element/). Một tên được chỉ định với 'element()' phải là một NCName và đề cập đến một phần tử _single_ được xác định bằng một xs: ID của tên đó. Đó rõ ràng không phải là những gì bạn muốn. –

Trả lời

3

tôi đã dabbled với điều này hơn một chút, và tìm thấy nhiều ví dụ trên web mà đề nghị những gì tôi đang làm là correct.This bây giờ là một phiên bản làm việc ...

<?xml version="1.0"?> 

<Root xmlns:xi="http://www.w3.org/2003/XInclude" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="http://testurl.com/now"> 

    <xi:include href="Test1.xml" xpointer="xmlns(ns=http://testurl.com/now)xpointer(/ns:Root/ns:element1)" parse="xml" /> 
    <xi:include href="Test2.xml" xpointer="xpointer(//Root/element1)" parse="xml" /> 

</Root> 

Ví dụ này sử dụng một phiên bản của Test1.xml có không gian tên và tệp Test2.xml không có.

Sản lượng hiện nay trông như thế này ....

<?xml version="1.0"?> 
<Root xmlns:xi="http://www.w3.org/2003/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://testurl.com/now"> 

    <ns:element1 xmlns:ns="http://testurl.com/now" id="001"> 
     <ns:element2 id="001.1" order="1"> 
      <ns:element3 id="001.1.1"/> 
     </ns:element2> 
     <ns:element2 id="001.2" order="2"> 
      <ns:element3 id="001.1.2"/> 
     </ns:element2> 
    </ns:element1><ns:element1 xmlns:ns="http://testurl.com/now" id="003"> 
     <ns:element2 id="007.0" order="1"> 
      <ns:element3 id="007.1.1"/> 
     </ns:element2> 
    </ns:element1><ns:element1 xmlns:ns="http://testurl.com/now" id="002"> 
     <ns:element2 id="002.1" order="3"> 
      <ns:element3 id="002.1.1"/> 
     </ns:element2> 
     <ns:element2 id="002.2" order="4"> 
      <ns:element3 id="002.1.2"/> 
     </ns:element2> 
    </ns:element1> 
    <element1 id="999"> 
     <element2 id="999.1" order="1"> 
      <element3 id="999.1.1"/> 
     </element2> 
    </element1> 

</Root> 

Đây là khóa học có thể chấp nhận, nó sẽ được tốt đẹp nếu ngắt dòng giữa mở và đóng của element1 vẫn có

+0

Các ngắt dòng không phải là một phần của các phần tử, do đó không thể được mua với tham chiếu các phần tử. Thử thêm '--pretty 1' vào dòng lệnh xmllint:' xmllint --pretty 1 -xinclude Merge.xml'. Điều đó vẫn sẽ không tái tạo khoảng cách ban đầu, nhưng trông đẹp hơn một chút. –

0

này hoạt động có và không có không gian tên:

<?xml version="1.0"?> 
<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:TestNamespace"> 

    <xi:include href="Test1.xml" xpointer="xpointer(*/*)" /> 
    <xi:include href="Test2.xml" xpointer="xpointer(*/*)" /> 

</ns:Root> 

cũng là parse="xml" là mặc định. Bạn không cần phải xác định nó.

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