Unikaj podwójnego cudzysłowu w XML

101

Czy istnieje znak ucieczki dla podwójnego cudzysłowu w XML? Chcę napisać tag taki jak:

<parameter name="Quote = " ">

ale jeśli wstawię „, to oznacza, że ​​ciąg się skończył. Potrzebuję czegoś takiego (c ++):

printf("Quote = \" ");

Czy jest znak do napisania przed podwójnym cudzysłowem, aby go uniknąć?

ufukgun
źródło

Odpowiedzi:

174

Spróbuj tego:

&quot;
Andrew Hare
źródło
120

Oto typowe znaki, które należy zmienić w XML, zaczynając od podwójnych cudzysłowów:

  1. podwójne cudzysłowy ( ") są zmieniane&quot;
  2. znak ampersand ( &) jest zmieniany do&amp;
  3. pojedyncze cudzysłowy ( ') są zmieniane na&apos;
  4. mniej niż ( <) jest zmieniane do&lt;
  5. większy niż ( >) jest zmieniany do&gt;
Alex Muriithi
źródło
3
Błędny; & apos; nie jest prawidłowym znakiem XML. Jest to poprawny znak HTML - czyli SGML i SUPERzbiór XML.
Stefan Steiger
Chociaż jest to ważna kwestia, większość nowoczesnych parserów XML, z którymi pracowałem, akceptuje go jako prawidłowy znak.
Dariusz G. Jagielski
& rdquo; nie jest poprawnie interpretowany przez system Android, gdy ciąg znaków jest otoczony podwójnymi cudzysłowami. W tym przypadku odpowiedź E-max jest jedyną działającą.
Softlion
@StefanSteiger jest na tej liście
OrangeDog
@Dariusz G. Jagielski: Chociaż nie mam nic przeciwko nowoczesnym parserom XML - jeśli pracujesz z XML w bazie danych (np. Ms / pg), zobaczysz, że nie każdy program używa nowoczesnych parserów XML. Zwłaszcza jeśli jest to złożone oprogramowanie sprzed dziesięcioleci. To powiedziawszy, gdyby wszyscy używali nowoczesnego parsera xml, byłoby dobrze. Jeśli jednak ten kod jest głęboko zintegrowany ze starszym, złożonym oprogramowaniem, bardzo trudno jest go zastąpić (zachowując 100% wsteczną kompatybilność). Wady C lub niestosowanie wstrzykiwania zależności, że tak powiem.
Stefan Steiger,
27

Inni odpowiedzieli, jak radzić sobie z konkretnymi ucieczkami w tym przypadku.

Szersza odpowiedź brzmi: nie próbuj robić tego samemu. Korzystaj z XML API - jest ich mnóstwo dla prawie każdej istniejącej nowoczesnej platformy programistycznej.

Interfejsy API XML obsługują takie rzeczy automatycznie, co znacznie utrudnia popełnienie błędu. O ile sam nie piszesz API XML, rzadko powinieneś martwić się o takie szczegóły.

Jon Skeet
źródło
11
Nie mogę powiedzieć, że się zgadzam. Wydaje się głupotą myślenie, że powinniśmy być tak uzależnieni od API, które abstrahują nas do tego stopnia, że ​​nie musimy nawet rozumieć, jak czytać i pisać XML. Interfejs API XML prawdopodobnie nie pomoże ci zbytnio, gdy wprowadzisz do niego zniekształcony dokument i wybuchnie. Ktoś będzie musiał naprawić dane, aby je załadować.
Christopher Painter,
@ChristopherPainter Biorąc pod uwagę rozmiar standardu XML, wątpię, czy jest bardzo wielu ludzi, którzy go rzeczywiście rozumieją. Teraz jest wielu, którzy myślą, że tak, ale tak naprawdę nie jest.
Unslander Monica
2
Cóż, musisz gdzieś zacząć. Oczywiście w naszej branży po prostu narzekamy, że XML jest do bani i zaczynamy od czegoś innego, jak JSON. Następnie proces się powtarza.
Christopher Painter
15

Nowa, ulepszona odpowiedź na stare, często zadawane pytanie ...

Kiedy unikać podwójnego cudzysłowu w XML

Podwójny cudzysłów ( ") może pojawić się bez zmiany znaczenia :

  • W treści tekstowej XML:

    <NoEscapeNeeded>He said, "Don't quote me."</NoEscapeNeeded>
  • W atrybutach XML rozdzielonych pojedynczymi cudzysłowami ( '):

    <NoEscapeNeeded name='Pete "Maverick" Mitchell'/>

    Uwaga: przejście na apostrofy ( ') również nie wymaga zmiany znaczenia:

    <NoEscapeNeeded name="Pete 'Maverick' Mitchell"/>

Podwójny cudzysłów ( ") musi zostać zmieniony :

  • W atrybutach XML rozdzielonych podwójnymi cudzysłowami:

    <EscapeNeeded name="Pete &quot;Maverick&quot; Mitchell"/>

Konkluzja

Podwójny cudzysłów ( ") musi zostać zmieniony, tak jak &quot;w XML, tylko w bardzo ograniczonych kontekstach.

kjhughes
źródło
7

Nie, nie ma znaku ucieczki jako takiego, zamiast tego możesz użyć znaku &quot;lub nawet <![CDATA["]]>go reprezentować ".

Matt Howells
źródło
6

Jeśli chcesz coś szybko wypróbować, oto szybkie i brudne rozwiązanie. Użyj apostrofów dla wartości atrybutu :

<parameter name='Quote = " '>
Brad Cupit
źródło
2

W C ++ możesz użyć EscapeXML ATL API. To jest poprawny sposób obsługi znaków specjalnych ...

Neven
źródło
1

Możesz spróbować użyć odwrotnego ukośnika, po którym następuje „u”, a następnie wartość Unicode dla znaku, na przykład wartość Unicode podwójnego cudzysłowu to

"-> U + 0022

Dlatego jeśli ustawisz go jako część tekstu w XML w Androidzie, wyglądałoby to mniej więcej tak,

<TextView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:text=" \u0022 Showing double quotes \u0022 "/>

Spowodowałoby to mniej więcej tekst w TextView

„Wyświetlam podwójne cudzysłowy”

Możesz znaleźć Unicode większości symboli i znaków tutaj www.unicode-table.com/en

E-maks
źródło
Możesz znaleźć Unicode większości symboli i znaków tutaj unicode-table.com/en
E-max