2009-06-28 19 views
6

He estado experimentando con el uso de MS Excel 2007 para editar datos tabulares almacenados en un archivo XML. Hace un buen trabajo al importar e incluso validar los datos XML con el esquema (archivo xsd), pero cuando los exporto, quita los atributos xmlns, xlmns: xsi y xsi: schemaLocation del elemento raíz. También cambia el espacio de nombre predeterminado a un espacio de nombre explícito.¿Hay alguna manera de hacer que Excel preserve los atributos XML en el elemento raíz?

He aquí una comparación antes/después:

Antes (el archivo XML antes de su importación en 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> 

Después (el archivo XML después de la exportación de 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> 

¿Hay alguna manera de evitar que Excel elimine estos atributos y el desorden? con los espacios de nombres? He leído la ayuda de MS sobre mapeo XML e importación/exportación, pero no parece haber ninguna configuración en la GUI para lo que quiero hacer. Si necesito escribir una macro personalizada, esa es una posibilidad, pero prefiero no hacer esto si hay una manera mejor/más fácil.

Una segunda pregunta: ¿Hay una mejor herramienta para permitir una fácil edición de ciertas partes de los archivos XML utilizando una interfaz de usuario similar a Excel?

+0

Tenga en cuenta que Excel no cambia el espacio de nombres. Solo está soltando el 'xsi: schemaLocation' y luego eliminando el espacio de nombres' xsi' no utilizado. –

Respuesta

3

bien, así que poco la bala y escribí un buen ol' macro VBA. Pensé que lo compartiría con todos ustedes en caso de que alguien más se encuentre con el mismo problema.

Esta macro llama básicamente el método de Excel incorporada Exportar XML() a continuación, realiza una serie de reemplazos de texto en el archivo resultante. Los reemplazos de texto son totalmente de usted. Sólo tiene que colocar en una hoja de cálculo como el que en el siguiente enlace ...

Un ejemplo de cómo configurar el "reemplazar reglas": Click me for screen cap

En este ejemplo, he sustituido pestaña con el espacio-espacio , ": ns1" con espacio en blanco, "ns1:" con espacio en blanco, y el elemento raíz desglosado con el elemento raíz original.

Puede dar formato al reemplazar las reglas de cualquier forma que desee, siempre y cuando siga estas instrucciones:

  1. seleccionar todos los "encontrar lo que" las células y darles el nombre * "FindWhat" (Don' t incluir una fila de encabezado en su selección; los espacios en blanco serán ignorados).
  2. seleccionar todos los "reemplazar con" células y darles el nombre * "sustituir con" (debe haber un uno-a-uno entre los "encontrar qué" y "reemplazar con" células; espacios en blanco Consulta para eliminar texto no deseado)
  3. Ingrese el nombre del Mapa XML en algún lugar de su libro de trabajo, y asígnele el nombre "XmlMap".
  4. Ejecutar la macro. (Se le pedirá que especifique el archivo al que desea exportar).

* Si no está familiarizado con los rangos de nombre en Excel 2007, haga clic en la pestaña Fórmulas y elija Administrador de nombres.

bien, no voy a tener en suspenso por más tiempo (LOL) ... aquí está el código de la macro. Simplemente colóquelo en un Módulo en el editor de VBA.No ofrezco ninguna garantía con este código gratuito (podría romperlo fácilmente si no nombra los rangos correctamente), pero los ejemplos de pareja que probé han funcionado para mí.

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

En realidad, es mucho más fácil que eso.

  1. Cambiar el sufijo a .xlsx.zip - el formato xlsx es en realidad la cremallera xml archivos!
  2. Abrir el archivo zip en el Explorador de Windows
  3. Vaya a la xl subdirectorio
  4. Copia el archivo xmlMaps.xml a un lugar fuera de la carpeta .zip
  5. Editar el archivo para reemplazar los nsX: registros con su espacio de nombres preferido y guarda tus cambios
  6. Copia el archivo y sobrescribir la versión en la carpeta .zip
  7. Cambiar el nombre de la carpeta a .xslx

Ahora su mapa (s) xml mostrará los espacios de nombres preferidos.

Cuestiones relacionadas