使用Node.js的xml2js模塊操做xml數據

在使用Node.js的過程當中,我通常使用json文件來存儲配置信息,或靜態文件信息存儲等。由於使用node

json文件在js中真的很方便:「讀取文件內容並轉換爲json數據後直接進行"."操做便可獲取或是修改npm

信息了」。json

最近因爲須要在前輩的Web應用中添加新功能,須要對XML文件進行操做,下面一塊兒來學習一下吧:數組

咱們使用node的擴展模塊xml2js來解析xml文件:app

1.安裝:在工程目錄下使用npm安裝:npm install xml2js異步

以後node_modules目錄下會新增兩個擴展:async

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中添加。
相關文章
相關標籤/搜索