improvement compatibility for the XML ignorable namespace

formula
xuri 5 years ago
parent ca43c65115
commit 13e7bce6d2
No known key found for this signature in database
GPG Key ID: BA5E5BB1C948EDF7

@ -379,14 +379,14 @@ func (f *File) replaceNameSpaceBytes(path string, contentMarshal []byte) []byte
func (f *File) addNameSpaces(path string, ns xml.Attr) { func (f *File) addNameSpaces(path string, ns xml.Attr) {
exist := false exist := false
mc := false mc := false
ignore := false ignore := -1
if attr, ok := f.xmlAttr[path]; ok { if attr, ok := f.xmlAttr[path]; ok {
for _, attribute := range attr { for i, attribute := range attr {
if attribute.Name.Local == ns.Name.Local && attribute.Name.Space == ns.Name.Space { if attribute.Name.Local == ns.Name.Local && attribute.Name.Space == ns.Name.Space {
exist = true exist = true
} }
if attribute.Name.Local == "Ignorable" && attribute.Name.Space == "mc" { if attribute.Name.Local == "Ignorable" && getXMLNamespace(attribute.Name.Space, attr) == "mc" {
ignore = true ignore = i
} }
if attribute.Name.Local == "mc" && attribute.Name.Space == "xmlns" { if attribute.Name.Local == "mc" && attribute.Name.Space == "xmlns" {
mc = true mc = true
@ -398,12 +398,23 @@ func (f *File) addNameSpaces(path string, ns xml.Attr) {
if !mc { if !mc {
f.xmlAttr[path] = append(f.xmlAttr[path], SourceRelationshipCompatibility) f.xmlAttr[path] = append(f.xmlAttr[path], SourceRelationshipCompatibility)
} }
if !ignore { if ignore == -1 {
f.xmlAttr[path] = append(f.xmlAttr[path], xml.Attr{ f.xmlAttr[path] = append(f.xmlAttr[path], xml.Attr{
Name: xml.Name{Local: "Ignorable", Space: "mc"}, Name: xml.Name{Local: "Ignorable", Space: "mc"},
Value: ns.Name.Local, Value: ns.Name.Local,
}) })
return
} }
f.setIgnorableNameSpace(path, ignore, ns)
}
}
// setIgnorableNameSpace provides a function to set XML namespace as ignorable by the given
// attribute.
func (f *File) setIgnorableNameSpace(path string, index int, ns xml.Attr) {
ignorableNS := []string{"c14", "cdr14", "a14", "pic14", "x14", "xdr14", "x14ac", "dsp", "mso14", "dgm14", "x15", "x12ac", "x15ac", "xr", "xr2", "xr3", "xr4", "xr5", "xr6", "xr7", "xr8", "xr9", "xr10", "xr11", "xr12", "xr13", "xr14", "xr15", "x15", "x16", "x16r2", "mo", "mx", "mv", "o", "v"}
if inStrSlice(strings.Fields(f.xmlAttr[path][index].Value), ns.Name.Local) == -1 && inStrSlice(ignorableNS, ns.Name.Local) != -1 {
f.xmlAttr[path][index].Value = strings.TrimSpace(fmt.Sprintf("%s %s", f.xmlAttr[path][index].Value, ns.Name.Local))
} }
} }

@ -1,6 +1,7 @@
package excelize package excelize
import ( import (
"encoding/xml"
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
@ -215,6 +216,13 @@ func TestBytesReplace(t *testing.T) {
assert.EqualValues(t, s, bytesReplace(s, []byte{}, []byte{}, 0)) assert.EqualValues(t, s, bytesReplace(s, []byte{}, []byte{}, 0))
} }
func TestSetIgnorableNameSpace(t *testing.T) {
f := NewFile()
f.xmlAttr["xml_path"] = []xml.Attr{{}}
f.setIgnorableNameSpace("xml_path", 0, xml.Attr{Name: xml.Name{Local: "c14"}})
assert.EqualValues(t, "c14", f.xmlAttr["xml_path"][0].Value)
}
func TestStack(t *testing.T) { func TestStack(t *testing.T) {
s := NewStack() s := NewStack()
assert.Equal(t, s.Peek(), nil) assert.Equal(t, s.Peek(), nil)

Loading…
Cancel
Save