2015-03-16 18 views
9

Tôi có tệp testDtd DTD cục bộ. Nội dung là:xmllint: cách xác thực XML bằng tệp DTD cục bộ

<!DOCTYPE coord [ 
<!ELEMENT coord (date)> 
<!ELEMENT date (#PCDATA)> 
]> 

Tôi muốn xác thực XML bằng xmllint. XML này không có DOCTYPE trong đó:

<?xml version="1.0" encoding="x-mac-roman"?> 
<coord> 
    <date>20150312</date> 
</coord> 

Không có vấn đề nếu tôi chèn khối DTD như một dòng 2nd sang một bản sao của tập tin XML của tôi và sử dụng:

xmllint --valid --noout my2.xml 

Nhưng khi tôi thử:

xmllint --loaddtd test.dtd --valid --noout my.xml 

xmllint --dtdvalid test.dtd --noout my.xml 

cả hai đều không hoạt động. Chuyến đi chơi là:

test.dtd:1: parser error : Content error in the external subset 
<!DOCTYPE coord [ 
^ 
test.dtd:1: parser error : Content error in the external subset 
<!DOCTYPE coord [ 
^ 
Could not parse DTD test.dtd 

Bất kỳ ý tưởng nào? Dường như XML PHẢI của tôi chứa dòng DOCTYPE (với từ khóa SYSTEM) để tham chiếu tệp DOCTYPE bên ngoài, mà tôi muốn tránh. Xem: http://www.w3schools.com/dtd/

Có giải pháp nào không sửa đổi XML không?

+0

Đầu ra từ lệnh đó là gì? – hek2mgl

+0

Dường như một cái gì đó với DTD là sai. Phải không? – hek2mgl

+0

Không vì khi tôi chèn văn bản DTD này vào XML như nó có, nó hoạt động. Có lẽ tôi cần một dòng giới thiệu trong tập tin văn bản DTD? –

Trả lời

11

Trước hết, các DTD bên ngoài không cần <!DOCTYPE lời mở đầu - loại bỏ nó từ tập tin DTD:

<!ELEMENT coord (date)> 
<!ELEMENT date (#PCDATA)> 

Sau đó, --loaddtdlấy về một DTD bên ngoài, mà không phải là giống như xác nhận chống lại một DTD bên ngoài. Sử dụng tùy chọn --dtdvalid như sau:

$ xmllint --noout --dtdvalid test.dtd test.xml 

Nếu tài liệu XML hợp lệ, xmllint sẽ không ra bất cứ điều gì (vì --noout). Nếu bạn thay đổi DTD để, nói:

<!ELEMENT coord (date,other)> 
<!ELEMENT date (#PCDATA)> 

Sản lượng sẽ

$ xmllint --noout --dtdvalid test.dtd test.xml 
test.xml:2: element coord: validity error : Element coord content does not follow the DTD, expecting (date , other), got (date) 
Document test.xml does not validate against test.dtd 

Look để biết thêm thông tin về các trang doc của NMT hoặc XMLSoft.

+0

Câu trả lời hay! ... – hek2mgl

+0

Cảm ơn. Nhưng không có gì nói rằng "điều phối" là phần tử gốc. –

+1

@EricH. Nếu bạn nghĩ về nó, bạn không cần phải biết phần tử nào là gốc. Điều quan trọng là bạn, tác giả của DTD, biết phần tử nào là phần tử gốc và viết một quy tắc cho nó. xmllint bắt đầu phân tích cú pháp một tài liệu XML ở gốc, vì vậy quy tắc này sẽ là đầu tiên được áp dụng. –

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