XML nitelik değeri normalleşme - nasıl varlıklar içerisinde boşluk olmalıdır tedavi edilebilir mi?

2 Cevap java

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 "&#xD;">
  <!ENTITY a "&#xA;">
  <!ENTITY t "&#x9;">
  <!ENTITY t2 " "><!-- a real tab-->
]>
<x a="CARRIAGE_RETURNS:(&d;&#xD;),NEWLINES:(&a;&#xA;),TABS:(&t;&#x9;&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.]
  • 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:(&#13;&#13;),NEWLINES:(&#10;&#10;),TABS:(&#9;&#9;&#9; )"/>

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;
  }

}

2 Cevap

Yani soru, varlık bir satırbaşı karakterinin yerine metin, ya da bir satır başı karakteri temsil karakter varlıktır?

Ve XML Tavsiye Ek D (özellikle "daha karmaşık bir örnek" olarak tanımlanan bir) (sizin örnekte) karakter varlık bir satırbaşı karakteri olması, ve olmamalıdır yedek metin görünür yılında örneklere bakarsanız . Hangisi "Java test" doğru biri olduğu anlamına gelir. Ekte benim yorumlanması doğru ise, en azından, bu.

Ancak gerçek kurallarını öğrenmek için Tavsiye vücut okumak zorunda kalacak demektir, Ek D non-normatif olduğunu unutmayın. Ben o bölüm 4.4 inanıyorum, ama bu tablo sadece başımı zarar yaptı.

Section 4.5: Construction of Entity Replacement Text XML spec iki önemli farklılıkları tanımlar.

  • Her varlık için literal entity value ve replacement text onun değişmez değer elde ediyor arasında bir ayrım var.
  • Bir dahili veya harici bir varlık olup olmamasına bağlı olarak, bu haritalama için farklı kurallar vardır.

Harici bir varlık, mevcut amaçlar için, C veya PHP bir içerme dosyası gibi olarak düşünülebilir - bu bir dosya veya kimin içeriği eklendi ve daha sonra işlenen başka bir dış kaynak bulunuyor. Bir dahili öğe DTD yük taşınır ve keyfi iç varlıklar DTD sözdizimi ile karışık olmadan yapılabilir olmasını sağlamak için, bu literal entity value olarak bilinen kaçan bir biçimde taşınmıştır. Onun replacement text, aşağıdaki kural uygulandığı değişmez varlık değeri dönüştürmek amacıyla:

For an internal entity, the replacement text is the content of the entity, after replacement of character references and parameter-entity references.

Yani:

  • Bir literal varlık değeri "[TAB]" yedek metne eşler [TAB]. Ben bu şeyleri karıştırmayın değil umut, daha ziyade gerçeği gösteriyor - Ben burada bu kutuya bir sekmeyi yazın ve anlaşılır olamaz beri [TAB], sekme karakteri anlamına gelen bir ad-hoc kaçış mekanizması ilan ediyorum Orada kaçış mekanizmaları için iyi nedenleri vardır, bu nedenle önemli şey kullanılan konum ve karmaşık görünen bir şey kaçış mekanizması farklı düzeylerde ayrılabilir nasıl nerede anlamaktır.
  • Bir literal varlık değeri "&x9;" de yedek metne eşler [TAB]. Yani kadarıyla nitelik değeri normalizasyon mantığı söz konusu olduğunda, bir sekme ve onu bir karakter referansı kullanılarak iç varlık temsil olduğunu bilmez. Bazı bilgilerin kayıp olduğu gereksiz olduğunu ya da gibi görünebilir, ama gerçekten - örneğin muhtemelen {[(2 her kullanımını yerini alabilir - kaçış mekanizmaları size kaçmak gerekmez şeyler de dahil olmak bir şey, kaçmak için izin )]} {tarafından bir HTML dosyasında [(3)]} ve kazanç ne de bilgileri kaybedersiniz ne.
  • Bir literal varlık değeri "&#38;#x9;" yedek metne eşler &#x9;. Nitelik değeri normalizasyon mantık bir sekme için bir karakter referans olarak yorumlamak olacak ve yerine onu çöken daha bir sekme olarak değerini normale olacaktır.
  • Yedek metne "&#38;#38;#x9;" haritaların literal varlık değeri &#38;#x9;
  • Ve böylece ...

Bir öznitelik değeri göstermek için [TAB] için sırayla, iç varlık edebi metni içeren gerektiğini birer off-veya çift-kodlama hatası çeşit gibi görünüyor &#38;#x9;. Bir çift-kodlama hatası izlenim DTD XML yaptığı gibi aynı karakter kaçış mekanizmasını kullanmak olur, ama farklı nedenlerle gerçeği ile oluşturulur. DTD'leridir bir sekme için \u0009 çizgisinde örneğin farklı bir kaçış mekanizması, kullandıysanız, o literal varlık değeri & # xyyyy-çıkış karakterlerinin serpiştirilmiş \ uyyyy öncelemeli karakterleri içerecek ve her zaman olabilir ne seviyeye ait olanı kaçış mekanizması söyle. Her neyse, o da bitti yol değil, o yüzden ters eğik algılamak için bir regex yazıyorsanız eğer, örneğin gibi ... Sadece oluyor ne iyi bir fikir olması gerekir, size göre regex ters eğik çizgi kaçmak zorunda Katlama ve regex değişmezleri olmayan bir dil kullanıyorsanız, size doğru kaçar bir dize koymak zorunda, bu yüzden tamamen yanlış görünen bir satırda, içinde dört ters eğik olarak biter ama düşündüğünüz zaman, bu doğru kaçış mekanizması farklı düzeylerde etkileşim (bu arada, ben aslen bu ters eğik yazmak için çalıştı, ama StackOverflow kendi kaçış mekanizması etrafında almak için ben arka arkaya sekiz ters eğik çizgi yazmak zorunda kalacaktı ve güvenli hissetmedim O yazmak için)

Yukarıdaki örnek kodda gösterildiği gibi spec bir açıklama olarak ve Java uygulama şu anda bana ok gibi görünüyor. Açıkçası PHP numune ile tutarlı değil, ve ben bir hata var olduğunu ima etmek anlamına gelmez - PHP DOM uygulama olgun C kütüphanesinin üstüne oturur, yapılandırma seçenekleri bir sürü, bir veya daha fazla olan tweakable olabilir Java numune ile tutarlı davranış olsun. Bu gibi örnekler karmaşık XML nasıl ... Ben yukarıda vermek gibi basitleştirilmiş açıklamalar zamanın% 95 gider ne broadgrained fikir almak için yararlı olabilir, ancak diğer 5% çok zor olabilir bana eve getirmek anlamak ve açıklamak. Yani orada benim açıklama ile bir kusur, ya da daha iyi bir açıklama varsa, bir yorum ya da başka bir cevap, daha bilgiçlik daha ekleyin lütfen.