Come gestire i metadati personalizzati in XML?

1

Backstory

Ho un documento di tipo XML ( SSML , che è usato per Text-To-Speech ), che sarà usato per generare file audio quando ssh trasferito su un server remoto. Di conseguenza, dovrò includere i metadati per i tag ID3 che in genere vengono utilizzati nei file audio (Genere, Titolo, Compositore, Album, ecc.).

Il mio approccio finora è stato quello di inventare un nuovo tag:

<metadata value="genre">
Froggy
</metadata>

E poi analizzarlo usando le espressioni regolari:

/* Grab Metadata */
QTerminalTools tt;
QFile file(filePath); 

if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    const QString metadata = file.readAll();

    QString genre(metadata);
    genre.replace(QRegularExpression("(?s)^.*"
                + QRegularExpression::escape("<metadata value=\"genre\">")
                +"\n(.*)?\n"  
                + QRegularExpression::escape("</metadata>")
                + ".*$")
                , "\1");
    qDebug().noquote() << tt.orange("Genre: " + genre);
}

Questo è davvero un approccio molto crudo che ho inventato al volo, quindi immagino che ci siano pratiche migliori di cui non sono a conoscenza. In quanto tale:

Domande

  • L'XML è stato progettato per gestire i metadati personalizzati?
  • Esiste già un tag standard in XML per i metadati personalizzati ( <metadata value="type">value</metadata> )?
  • I parser XML sono standardizzati nel caso in cui sia necessario creare il mio?
  • Ci sono problemi di sicurezza nella creazione dei miei tag?

Grazie.

    
posta Akiva 14.03.2017 - 21:40
fonte

3 risposte

2

XML è progettato per gestire dati arbitrari. Non distingue tra dati e metadati, ma dispone di funzionalità che consentono di combinare dati di più tipi definiti indipendentemente l'uno dall'altro in un singolo file. Per fare ciò, utilizza una nozione di spazi dei nomi, che può essere utilizzata per identificare più schemi. Un esempio potrebbe essere simile a questo:

<?xml version="1.0" ?>
<mydoc xmlns="schema URL 1" xmlns:meta="schema 2">
    <meta:description>a demonstration</meta:description>
</mydoc>

Ciò che questo file contiene sono dati in due formati definiti in modo indipendente. L'attributo "xmlns" fornisce un identificatore (convenzionalmente un URI) per i tag che non hanno un prefisso namespace, mentre "meta: xmlns" identifica il formato utilizzato per i tag con prefisso "meta:"

Molti parser XML ti permetteranno di identificare facilmente che cosa sia l'identificatore uri per ogni tag o attributo.

Potresti quindi usarlo per mantenere separati i tag dei metadati dai tag definiti nel formato che stai utilizzando. Esistono anche formati ben noti per i tag di metadati. Una ricerca di qualcosa come "XML metadata schema" dovrebbe far apparire le descrizioni di alcuni comuni. O potresti definire il tuo se preferisci: basta creare un URI per il tuo spazio dei nomi e usarlo in modo coerente e tutto dovrebbe funzionare

    
risposta data 15.03.2017 - 00:00
fonte
5

Oltre al fatto che è un pessima idea di analizzare XML con le espressioni regolari , provo a rispondere alle tue domande:

Was XML designed to handle custom metadata?

XML è progettato per gestire tutti i tipi di dati o metadati e ciò che si chiama "metadati" da un punto di vista può essere chiamato solo "dati" da un altro punto di vista. La distinzione è in qualche modo arbitraria.

Is there already a standard tag in XML for ...

Non ci sono "tag standard" in XML. XML non è un formato dati specifico, è più un set di regole su come creare formati di dati. E quando vuoi avere un tag con una semantica specifica, devi sempre definire il tag e la semantica da solo.

Are XML parsers standardized in case I need to build my own?

Sono abbastanza sicuro che non hai bisogno di creare il tuo parser, prova ad usarne uno esistente. Come una distinzione grossolana, ci sono parser basati su DOM (che leggono completamente un documento XML) e parser SAX, che consentono di leggere sequenzialmente XML senza conservare l'intero documento in memeory. I precedenti sono in genere più facili da usare, questi ultimi hanno un migliore impatto sulla memoria.

Among the available parsers, assuming most are good, are there any I should avoid?

Spiacenti, non forniamo consigli sugli strumenti su questo sito . Meglio cancellare quella parte della tua domanda, altrimenti la comunità potrebbe chiudere la tua domanda come fuori tema. Tuttavia, dal momento che stai usando Qt, ti consiglio di informarti sui parser Xml inclusi in Qt - Google è tuo amico, trovato questa vecchia domanda SO in pochi secondi.

Are there any security issues involved with creating my own tags?

Risposta breve: no. Come utilizzeresti altrimenti XML per creare formati di dati, se non creando tag?

    
risposta data 14.03.2017 - 23:40
fonte
0

Non dovresti usare espressioni regolari o altrimenti provare a analizzare i tag xml manualmente. Invece dovresti usare una libreria XML dedicata per qualsiasi lingua tu stia usando. Puoi facilmente estrarre le informazioni nei tag con il modello di oggetto documento supportato dalla maggior parte delle librerie: link

    
risposta data 14.03.2017 - 23:00
fonte

Leggi altre domande sui tag