2015-12-11 65 views
5

Tworzę prosty plik XML 1.0 za pomocą krótkiej funkcji PL/SQL wypełnionej danymi z tabeli.PL/SQL konwertowanie znaków specjalnych

Dane z tabeli zawierają również znaki HTML, takie jak <>, & i tak dalej. Dla tych znaków specjalnych Mam zbudować krótki szukanie i funkcję, która wygląda tak wymienić:

newXmlString := REPLACE(xmlString, '&', '&amp;'); 
newXmlString := REPLACE(newXmlString, '\', ''); 
newXmlString := REPLACE(newXmlString, '<', '&lt;'); 
newXmlString := REPLACE(newXmlString, '>', '&gt;'); 
newXmlString := REPLACE(newXmlString, '"', '&quot;'); 
newXmlString := REPLACE(newXmlString, '''', '&apos;'); 

Teraz nie ma więcej danych w tabeli, która ma ten skutek, że plik XML nie jest w stanie zweryfikować z powodu specjalne znaki sterujące (https://en.wikipedia.org/wiki/Control_character), takie jak:

  • ETX (koniec tekstu)
  • SYN (Synchronous Idle)

Uwaga: Nie każdy znak kontrolny uszkadza sprawdzanie poprawności pliku XML! Linebreaks lub Carriage Return są nadal możliwe.

Oczywiście, że teraz można wyszukiwać i zastępować je również, na przykład:

newXmlString := REPLACE(newXmlString, chr(3), ''); -- ETX end of text 

Ale jest tam budować w funkcji lub coś podobnego biblioteki można używać z PL/SQL bez podawania i poszukiwania + zastępując je?

UPDATE 1

Próbowałem również użyć funkcji dbms_xmlgen.getxml ale ta funkcja zgłasza błąd z powodu 'specjalnego char do uciekł konwersja char nie powiodło się.' +

UPDATE 2

Próbowałem użyć REGEXP_REPLACE(STRING_VALUE,'[[:cntrl:]]'), który zadziała, ale spowoduje to również usunięcie podziałów linii, które chcemy zachować, a także nie ma wpływu na sprawdzanie poprawności pliku XML.

+1

myślę 'dbms_xmlgen.convert()' jest to, czego szukasz –

+0

@a_horse_with_no_name: będzie konwertować znaki html ale też nie znaki sterujące, takie jak „SYN” – frgtv10

+0

Ale używając że nie trzeba dbać o wszystkie znaki HTML, tylko znaki kontrolne. –

Odpowiedz

1

TRANSLATE jest rzeczywiście drogą do zrobienia. Zbuduj ciąg znaków za pomocą funkcji CHR i zastosuj go tylko raz. Oto przykład dla ETX: 3, EOT: 4 i SYN: 22. Możesz dołączać inne, gdy są potrzebne.

Zwróć uwagę na "a" na początku łańcucha, który zwraca jako jedyny znak w drugim ciągu. Ta funkcja wymaga jednego znaku, który nie zostanie usunięty.

FUNCTION clean_control(in_text IN VARCHAR2) 
    RETURN VARCHAR2 
IS 
    v_search VARCHAR2(30) := 'a' || CHR(3) || CHR(4) || CHR(22); 
BEGIN 
    RETURN TRANSLATE(in_text, v_search, 'a'); 
END; 
+0

Dziękuję za tę bardzo dobrą funkcję – frgtv10