Ben bir XML ayrıştırıcı aşağıdaki örnekteki a
elemanın niteliği x
okur ne olması gerektiğini anlamak için çalışıyorum:
<!DOCTYPE x [
<!ELEMENT x EMPTY>
<!ATTLIST x a CDATA #IMPLIED>
<!ENTITY d "
">
<!ENTITY a "
">
<!ENTITY t "	">
<!ENTITY t2 " "><!-- a real tab-->
]>
<x a="CARRIAGE_RETURNS:(&d;
),NEWLINES:(&a;
),TABS:(&t;	&t2; )"/><!-- a real tab at the end -->
Spec Attribute-Value Normalization kuralların önemli bir parçası nitelik değerini geçme ve bu durumda açıklama uygulayarak içerir:
- Bir karakter gönderimi için, normalleştirilmiş değere başvurulan karakteri ekler.
- Bir öğe gönderimi için, özyinelemeli varlık yerine metin adımı bu algoritmanın [case ifadesi bulunuyor] 3 geçerlidir. [EDIT: replacement text, literal entity value farklı olarak, ne oluyor anlamada anahtar kavram gibi görünüyor. Aşağıya bakınız.] Em>
- Bir boşluk karakteri (# x20, # xD, # xA, # x9) için, normalleştirilmiş değere bir boşluk karakteri (# x20) ekleyin.
- Başka bir karakter için, normalleştirilmiş değere o karakter eklenir.
Bu kurallar benim okuma beni (: aynı kurallar nitelik veya varlık olsun uygulamak - korunmuş karakter referansları, gerçek karakterlerin yerini yorumlama) aşağıdaki gibi öznitelik değeri için XML çözümleyici çıktısı olması gerektiğini düşünüyorum yol açacaktır:
CARRIAGE_RETURNS: ([CR] [CR]), yeni satır: ([NL] [NL]), SEKMELERİ: ([TAB] [TAB] [SPACE] [SPACE])
Ancak, biraz spec aşağıda verilen örnek aşağıdaki gibi çıkış olması gerektiğini göstermektedir, ve bir Java test ben tam olarak bu şekilde eserler yazdı (yorumlama: bir öğe değeri ise, bu always Yedek):
CARRIAGE_RETURNS: ([SPACE] [CR]), yeni satır: ([SPACE] [NL]), SEKMELERİ: ([SPACE] [TAB] [SPACE] [SPACE])
Öte yandan, ben PHP yazdığı bir test bu (yorumu: bir öğe değeri ise, bu never yedek) verir:
CARRIAGE_RETURNS: ([CR] [CR]), yeni satır: ([NL] [NL]), SEKMELERİ: ([TAB] [TAB] [TAB] [SPACE])
Benzer çıktı xsltproc aracını kullanarak dönüşümü bir kimlik XSLT'de ile xml dosyasını çalıştırarak verilir:
<x a="CARRIAGE_RETURNS:( ),NEWLINES:( ),TABS:(			 )"/>
Yani benim soru: what should happen and why?
Aşağıda örnek PHP ve Java programları:
PHP:
// Library versions from phpinfo():
// DOM/XML API Version 20031129
// libxml Version 2.6.32
$doc = new DOMDocument();
$doc->load("t.xml");
echo str_replace(array("\t", " ", "\r", "\n"), array("[TAB]", "[SPACE]", "[CR]", "[NL]"), $doc->documentElement->getAttribute("a")), "\n";
Java:
import java.io.*;
class T{
public static void main(String[] args) throws Exception {
String xmlString = readFile(args[0]);
System.out.println(xmlString);
org.w3c.dom.Document doc =
javax.xml.parsers.DocumentBuilderFactory.newInstance().
newDocumentBuilder().
parse(new org.xml.sax.InputSource(new StringReader(xmlString)));
System.out.println(doc.getImplementation());
System.out.println(
doc.
getDocumentElement().
getAttribute("a").
replace("\t", "[TAB]").
replace(" ", "[SPACE]").
replace("\r", "[CR]").
replace("\n", "[NL]")
);
}
// Very rough, but works in this case
private static String readFile(String fileName) throws IOException {
File file = new File(fileName);
InputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[(int)file.length()];
int length = inputStream.read(buffer);
String result = new String(buffer, 0, length);
inputStream.close();
return result;
}
}