2009-06-28 14 views
6

XML dosyasında depolanan tablo verilerini düzenlemek için MS Excel 2007'yi kullanmayı denedim. XML verilerini şemaya (xsd dosyası) karşı içe aktarma ve hatta doğrulama konusunda iyi bir iş yapar, ancak dışa aktardığımda, xmlns, xlmns: xsi ve xsi: schemaLocation özniteliklerini kök öğesinden bırakır. Ayrıca varsayılan ad alanını açık bir ad alanına değiştirir.XML öğesinin XML öğelerini kök öğesinde tutmasını sağlamanın bir yolu var mı?

İşte karşılaştırdıktan sonra/a önce açıklanmıştır:

(Excel'den ihracat sonra XML dosyası) sonra

<?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> 

(Excel'e aktarmadan önce XML dosyası)

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

Excel'in bu öznitelikleri ve karışıklıkları çözmesini engellemenin bir yolu var mı? İsim alanları ile? XML haritalama ve içe aktarma/dışa aktarma konusunda MS yardımını okudum ama GUI'de yapmak istediklerim için herhangi bir ayar yok gibi görünüyor. Özel bir makro yazmam gerekirse, bu bir olasılıktır, ancak daha iyi/daha kolay bir yol varsa bunu yapmamayı tercih ederim.

İkinci soru: XML dosyalarının belirli bölümlerinin Excel benzeri bir kullanıcı arabirimi kullanarak kolayca düzenlenmesini sağlamak için daha iyi bir araç var mı?

+0

Excel'in ad alanını değiştirmediğini unutmayın. Sadece xsi: schemaLocation öğesini bırakıp kullanılmayan 'xsi 'ad alanını kaldırır. –

cevap

3

Tamam, ben mermiyi ısırdım ve iyi bir 'VBA makrosu yazdım. Başka birinin aynı problemle karşılaşması durumunda sizinle paylaşacağımı düşündüm.

Bu makro, temel olarak Excel'in yerleşik XML Export() yöntemini çağırır ve sonuçta oluşan dosyada bir dizi metin değiştirmesi gerçekleştirir. Metin değiştirmeleri tamamen size kalmış. Sadece ... Aşağıdaki linkte gibi bir çalışma sayfasında

nasıl kurulacağı bir örnek koyun "kurallarını yerine": Bu örnekte Click me for screen cap

, ben uzay alanı ile sekmesinin yerini Boş, "ns1:" ile boş, ve özgün kök öğesi ile soyulmuş aşağı kök öğesi, ": ns1".

bu talimatları izleyin olarak sadece sürece, sizin biçimlendirmek kurallarını istediğiniz şekilde değiştirebilirsiniz:

  1. tüm hücreler "ne Bul" ve Adını onlara * "FindWhat" vermek seçiniz (don' Seçiminize bir başlık satırı eklemeyin; boşluklar göz ardı edilecektir).
  2. "Değiştir" hücrelerini seçin ve adı "Değiştir" ile belirtin ("ne olduğunu bul" ve "değiştir" hücreleri arasında bire bir eşleşme olmalıdır; istenmeyen metni kaldırmak için boşluklar kullanın)).
  3. Çalışma kitabınızda XML Haritasının adını girin ve bu hücreyi "XmlMap" olarak adlandırın.
  4. Makroyu çalıştırın. (Dışa aktarmak istediğiniz dosyayı belirtmeniz istenecektir.)

* Excel 2007'de adlandırma aralıklarına aşina değilseniz, Formüller sekmesini tıklatın ve Ad Yöneticisi'ni seçin.

Tamam, sizi artık gerilim altında tutmayacağım (LOL) ... işte makro için kod. Sadece VBA editöründe bir Modül içine yerleştirin.Bu ücretsiz kodla hiçbir garanti vermiyorum (aralıkları düzgün bir şekilde isimlendirmezseniz kolayca koparabilirsiniz), ama denediğim birkaç örnek benim için çalışmıştı.

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

Aslında, bundan çok daha kolay.

  1. .xlsx eki .zip değiştirin - xlsx biçimi aslında xml dosyaları fermuarlı!
  2. Açık xl alt dizinine
  3. Kopya .zip klasörün
  4. düzenleyin tercih ad ile nsX: girdileri değiştirmek için dosya dışında bir konuma xmlMaps.xml dosya için
  5. Göz Windows Explorer zip dosyası ve değişikliklerinizi kaydedin.
  6. Kopya dosya ve Şimdi xml harita (lar) tercih ad alanları gösterecektir .xslx

geri klasörü yeniden adlandırma .zip klasörün

  • yılında sürümünün üzerine.

  • İlgili konular