From 13e7bce6d22bd8989084f34280fffcefef7ad9b7 Mon Sep 17 00:00:00 2001 From: xuri Date: Mon, 20 Jul 2020 00:05:37 +0800 Subject: [PATCH] improvement compatibility for the XML ignorable namespace --- lib.go | 21 ++++++++++++++++----- lib_test.go | 8 ++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib.go b/lib.go index 0efb074..2d2c1fa 100644 --- a/lib.go +++ b/lib.go @@ -379,14 +379,14 @@ func (f *File) replaceNameSpaceBytes(path string, contentMarshal []byte) []byte func (f *File) addNameSpaces(path string, ns xml.Attr) { exist := false mc := false - ignore := false + ignore := -1 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 { exist = true } - if attribute.Name.Local == "Ignorable" && attribute.Name.Space == "mc" { - ignore = true + if attribute.Name.Local == "Ignorable" && getXMLNamespace(attribute.Name.Space, attr) == "mc" { + ignore = i } if attribute.Name.Local == "mc" && attribute.Name.Space == "xmlns" { mc = true @@ -398,12 +398,23 @@ func (f *File) addNameSpaces(path string, ns xml.Attr) { if !mc { f.xmlAttr[path] = append(f.xmlAttr[path], SourceRelationshipCompatibility) } - if !ignore { + if ignore == -1 { f.xmlAttr[path] = append(f.xmlAttr[path], xml.Attr{ Name: xml.Name{Local: "Ignorable", Space: "mc"}, 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)) } } diff --git a/lib_test.go b/lib_test.go index e4ccdcc..f3e9b3e 100644 --- a/lib_test.go +++ b/lib_test.go @@ -1,6 +1,7 @@ package excelize import ( + "encoding/xml" "fmt" "strconv" "strings" @@ -215,6 +216,13 @@ func TestBytesReplace(t *testing.T) { 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) { s := NewStack() assert.Equal(t, s.Peek(), nil)