在使用Node.js的過程中,我一般使用json文件來存儲配置信息,或靜態文件信息存儲等。因為使用
json文件在js中真的很方便:“讀取文件內容並轉換為json數據后直接進行"."操作即可獲取或是修改
信息了”。
最近由於需要在前輩的Web應用中添加新功能,需要對XML文件進行操作,下面一起來學習一下吧:
我們使用node的擴展模塊xml2js來解析xml文件:
1.安裝:在工程目錄下使用npm安裝:npm install xml2js
之后node_modules目錄下會新增兩個擴展:
xml2js是用於解析xml文件的擴展,使用后可以將xml格式數據轉為json格式
xmlbuilder適用於將json格式數據轉換為xml格式的擴展
2.安裝完成后的使用:
在app.js中導入:
const xml2js = require('xml2js');
導入后創建解析器xmlParser,Parser方法中含有options參數,可用於一些自定義的設置,下面會有部分介紹:
//xml解析器 var xmlParser = new xml2js.Parser();
讀取xml文件:
//讀取xml文件
var data = fs.readFileSync(filePath);
使用xml解析器獲取xml文件數據,使用創建解析器的parseString方法,第一個參數是fs.readFileSync讀取的數據,
第二個參數是一個回調函數,包含兩個參數,一是錯誤處理err,二是返回的解析結果result:
xmlParser.parseString(data,function(err,result){ var strings = result.resources.string picPreview.textInfo.nameCn = strings[0]._; });
我的xml文檔結構如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">gfsd</string> <string name="app_name_private">Cloud</string> <string name="app_type">Enterprise Cloud</string> <string name="login_mail">Email/Mobile</string> </resources>
獲取的解析結果打印如下:
result:[object Object]
result = { resources:{ string:[ { _:gfsd, $:{ name:app_name } },{ _:Cloud, $:{ name:app_name_private }, ............依次類推 } ] } }
由上可以看出解析的結果,數據的獲取現在就是操作json了,但我們看到,xml數據中的string節點
被解析成了一個數組,這是因為xml2js默認會把子子節點的值變為一個數組,怎么解決這一問題呢?
很簡單,只要在創建xml解析器時設置options中的explicitArray參數為false即可:
var xmlParser = new xml2js.Parser({expzhe'llicitArray : false, ignoreAttrs : true})
摘自npm中的解釋,解析器的更多參數含義(只包含部分且使用Google翻譯,詳盡解釋請訪問這里):
attrkey
(默認值$
:):用於訪問屬性的前綴。版本0.1默認為@
。charkey
(默認值_
:):用於訪問角色內容的前綴。版本0.1默認為#
。explicitCharkey
(默認值:false
)trim
(默認值false
:):修剪文本節點開頭和結尾的空格。normalizeTags
(默認值false
:):將所有標記名稱標准化為小寫。normalize
(默認值false
:):修剪文本節點內的空格。explicitRoot
(默認值:):true
如果要在結果對象中獲取根節點,請設置此項。emptyTag
(默認值:):''
空節點的值是多少。explicitArray
(默認值:):true
如果為true,則始終將子節點放在數組中; 否則只有在有多個數組時才會創建數組。ignoreAttrs
(默認值false
:):忽略所有XML屬性,僅創建文本節點。mergeAttrs
(默認值false
:):將屬性和子元素合並為父元素的屬性,而不是將子屬性對象的屬性鍵入。如果ignoreAttrs
是,則忽略此選項false
。validator
(默認值null
):您可以指定一個callable,以某種方式驗證生成的結構,無論如何。有關示例,請參閱單元測試。xmlns
(默認false
):為每個元素提供一個通常稱為“$ ns”的字段(第一個字符與attrkey相同),該字段包含其本地名稱和名稱空間URI。explicitChildren
(默認值false
):將子元素放在單獨的屬性中。不適用mergeAttrs = true
。如果元素沒有子元素,則不會創建“children”。在0.2.5中添加。childkey
(默認值$$
):如果explicitChildren
設置為,則用於訪問子元素的前綴true
。在0.2.5中添加。preserveChildrenOrder
(默認值false
):修改行為,explicitChildren
以使“children”屬性的值成為有序數組。如果是這樣true
,每個節點也將獲得一個#name
字段,其值將對應於XML nodeName,以便您可以迭代“children”數組並仍然能夠確定節點名稱。命名(和可能無序)屬性也在此配置中保留在與有序“children”數組相同的級別。在0.4.9中添加。charsAsChildren
(默認值false
):確定如果explicitChildren
打開,是否應將字符視為子項。在0.2.5中添加。includeWhiteChars
(默認值false
):確定是否應包含僅限空白的文本節點。在0.4.17中添加。async
(默認值false
):回調應該是異步的嗎?如果您的代碼依賴於回調的同步執行,則這可能是不兼容的更改。未來版本xml2js
可能會更改此默認值,因此建議不依賴於同步執行。在0.2.6中添加。strict
(默認值true
):將sax-js設置為嚴格或非嚴格解析模式。默認為true
這是強烈推薦,因為解析這是不正確的XML可能產生幾乎任何HTML。在0.2.7中添加。