2009-06-28 10 views
6

Ho provato a utilizzare MS Excel 2007 per modificare i dati tabulari memorizzati in un file XML. Fa un buon lavoro di importazione e persino di validazione dei dati XML rispetto allo schema (file xsd), ma quando esporto, rilascia gli attributi xmlns, xlmns: xsi e xsi: schemaLocation dall'elemento root. Cambia anche lo spazio dei nomi predefinito in uno spazio dei nomi esplicito.Esiste un modo per far sì che Excel mantenga gli attributi XML nell'elemento radice?

Ecco una prima/dopo il confronto:

Prima (il file XML prima dell'importazione in Excel)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<database 
    xmlns="experimentManager" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="experimentManager Database.xsd"> 
    <conditionTokens> 
    ... 
    </conditionTokens> 
    <participants> 
    ... 
    </participants> 
</database> 

Dopo (il file XML dopo l'esportazione da Excel)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:database xmlns:ns1="experimentManager"> 
    <ns1:conditionTokens> 
     ... 
    </ns1:conditionTokens> 
    <ns1:participants> 
     ... 
    </ns1:participants> 
</ns1:database> 

Esiste un modo per impedire a Excel di rimuovere questi attributi e incasinare con gli spazi dei nomi? Ho letto l'aiuto di MS su mappatura XML e importazione/esportazione, ma non sembrano esserci impostazioni nella GUI per quello che voglio fare. Se ho bisogno di scrivere una macro personalizzata, questa è una possibilità, ma preferirei non farlo se c'è un modo migliore/più semplice.

Una seconda domanda: esiste uno strumento migliore per consentire la modifica facile di determinate parti di file XML utilizzando un'interfaccia utente simile a Excel?

+0

Si noti che Excel non sta cambiando lo spazio dei nomi. Elimina solo 'xsi: schemaLocation' e quindi rimuove lo spazio dei nomi' xsi' non utilizzato. –

risposta

3

Ok, bene ho morso il proiettile e ho scritto una buona vecchia macro VBA. Ho pensato di condividerlo con tutti voi nel caso in cui qualcun altro si imbattesse nello stesso problema.

Questa macro chiama fondamentalmente il metodo XML Export() incorporato di Excel, quindi esegue una serie di sostituzioni di testo sul file risultante. Le sostituzioni di testo dipendono interamente da te. Basta metterli in un foglio di lavoro come quello nel link qui sotto ...

Un esempio di come impostare il "sostituire regole": Click me for screen cap

In questo esempio, ho sostituito scheda con lo spazio-spazio , ": ns1" con spazio vuoto, "ns1:" con spazio vuoto e l'elemento radice rimosso con l'elemento radice originale.

È possibile formattare il sostituire le regole come più ti piace, proprio come quando si seguono le istruzioni:

  1. selezionare tutti i "trovare quello" cellule e dare loro il nome * "FindWhat" (don' t includere una riga di intestazione nella selezione, gli spazi saranno ignorati).
  2. Seleziona tutte le celle "Sostituisci con" e dai loro il nome * "SostituisciCon" (dovrebbe esserci un mapping uno-a-uno tra le celle "trova cosa" e "sostituisci con"; usa spazi vuoti per rimuovere il testo indesiderato).
  3. Immettere il nome della mappa XML da qualche parte nella cartella di lavoro e denominare la cella "XmlMap".
  4. Esegui la macro. (Verrà richiesto di specificare il file che si desidera esportare.)

* Se non si ha familiarità con gli intervalli di denominazione in Excel 2007, fare clic sulla scheda Formule e selezionare Gestione nomi.

Ok, non ti terrò più in sospeso (LOL) ... ecco il codice per la macro. Basta inserirlo in un modulo nell'editor VBA.Non offro garanzie con questo codice gratuito (potresti facilmente romperlo se non chiami le gamme correttamente), ma gli esempi di coppia che ho provato hanno funzionato per me.

Option Explicit 

Sub ExportXml() 
    Dim exportResult As XlXmlExportResult 
    Dim exportPath As String 
    Dim xmlMap As String 
    Dim fileContents As String 
    exportPath = RequestExportPath() 
    If exportPath = "" Or exportPath = "False" Then Exit Sub 
    xmlMap = range("XmlMap") 
    exportResult = ActiveWorkbook.XmlMaps(xmlMap).Export(exportPath, True) 
    If exportResult = xlXmlExportValidationFailed Then 
     Beep 
     Exit Sub 
    End If 
    fileContents = ReadInTextFile(exportPath) 
    fileContents = ApplyReplaceRules(fileContents) 
    WriteTextToFile exportPath, fileContents 
End Sub 

Function ApplyReplaceRules(fileContents As String) As String 
    Dim replaceWorksheet As Worksheet 
    Dim findWhatRange As range 
    Dim replaceWithRange As range 
    Dim findWhat As String 
    Dim replaceWith As String 
    Dim cell As Integer 
    Set findWhatRange = range("FindWhat") 
    Set replaceWithRange = range("ReplaceWith") 
    For cell = 1 To findWhatRange.Cells.Count 
     findWhat = findWhatRange.Cells(cell) 
     If findWhat <> "" Then 
      replaceWith = replaceWithRange.Cells(cell) 
      fileContents = Replace(fileContents, findWhat, replaceWith) 
     End If 
    Next cell 
    ApplyReplaceRules = fileContents 
End Function 

Function RequestExportPath() As String 
    Dim messageBoxResult As VbMsgBoxResult 
    Dim exportPath As String 
    Dim message As String 
    message = "The file already exists. Do you want to replace it?" 
    Do While True 
     exportPath = Application.GetSaveAsFilename("", "XML Files (*.xml),*.xml") 
     If exportPath = "False" Then Exit Do 
     If Not FileExists(exportPath) Then Exit Do 
     messageBoxResult = MsgBox(message, vbYesNo, "File Exists") 
     If messageBoxResult = vbYes Then Exit Do 
    Loop 
    RequestExportPath = exportPath 
End Function 

Function FileExists(path As String) As Boolean 
    Dim fileSystemObject 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    FileExists = fileSystemObject.FileExists(path) 
End Function 

Function ReadInTextFile(path As String) As String 
    Dim fileSystemObject 
    Dim textStream 
    Dim fileContents As String 
    Dim line As String 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    Set textStream = fileSystemObject.OpenTextFile(path) 
    fileContents = textStream.ReadAll 
    textStream.Close 
    ReadInTextFile = fileContents 
End Function 

Sub WriteTextToFile(path As String, fileContents As String) 
    Dim fileSystemObject 
    Dim textStream 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    Set textStream = fileSystemObject.CreateTextFile(path, True) 
    textStream.Write fileContents 
    textStream.Close 
End Sub 
0

In realtà, è molto più facile di così.

  1. Modificare il .xlsx suffisso .zip - il formato xlsx è in realtà zippato xml file!
  2. Aprire il file zip in Esplora risorse
  3. Passare alla xl sottodirectory
  4. Copiare il file xmlMaps.xml in una posizione al di fuori della cartella .zip
  5. Modificare il file per sostituire i nsX: voci con lo spazio dei nomi preferito e salva le tue modifiche.
  6. Copiare il file e sovrascrivere la versione nella cartella di .zip
  7. Rinominare la cartella di nuovo a .xslx

Ora il vostro programma XML (s) mostrerà i vostri spazi dei nomi preferiti.