解析复杂的XML并提取值

时间:2019-05-15 15:04:38

标签: c# xml serialization

给出以下复杂的xml。

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
   <params>
      <param>
         <value>
            <struct>
               <member>
                  <name>resps</name>
                  <value>
                     <array>
                        <data>
                           <value>
                              <struct>
                                 <member>
                                    <name>param0</name>
                                    <value>
                                       <struct>
                                          <member>
                                             <name>param1</name>
                                             <value>
                                                <int>12</int>
                                             </value>
                                          </member>
                                          <member>
                                             <name>param2</name>
                                             <value>
                                                <int>12</int>
                                             </value>
                                          </member>
                                       </struct>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param12</name>
                                    <value>
                                       <int>3143</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param3</name>
                                    <value>
                                       <int>207</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param4</name>
                                    <value>
                                       <int>4056</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param5</name>
                                    <value>
                                       <int>267</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param6</name>
                                    <value>
                                       <double>1.290682</double>
                                    </value>
                                 </member>
                              </struct>
                           </value>
                        </data>
                     </array>
                  </value>
               </member>
               <member>
                  <name>errors</name>
                  <value>
                     <array>
                        <data />
                     </array>
                  </value>
               </member>
            </struct>
         </value>
      </param>
   </params>
</methodResponse>

我希望对此进行解析,并找出对我来说至关重要的键/值-例如param0和param1,依此类推。

我尝试了多种方法。从使用xpath到必要的节点,解析为JObject并以这种方式询问它,或者只是将其保留为字符串并尝试RegEx我需要的项目。我什至可以深入了解XML的内部文本,并尝试提取迭代不同字符的文本。

我不愿意将此反序列化为一个对象,那样只会将问题转换为强类型。

所有这些方法都感觉很笨拙,无法维护。我正在寻找以最佳方式处理/解析此数据的建议或指导。

我根本无法更改数据源。

1 个答案:

答案 0 :(得分:0)

万一有人想知道-我能够通过获取所有成员节点并忽略不需要的无关节点来解决我的问题。以下代码为我提供了我感兴趣的所有值的字典。它当然不是很优雅,但是可以完成工作。

let carArr = []

const query = "SELECT brand, model, color from cars"
mysql.query(query, values, (err, result) => {
    for (let i = 0; i < result.length; i++) {
        // Get the index of the brand in the carArr array
        let brandIndex = carArr.map(c => c.brand).indexOf(result.brand)

        // If the brand is not already in carArr, enter a new value for it
        if(brandIndex == -1)
            carArr.push({"brand": result.brand, "cars": [{"model": result.model, "color": result.color}]})

        // If the brand already exists, add the car type to this specific barnd
        else
            carArr[brandIndex].cars.push({"model": result.model, "color": result.color})
    }
})

如您所见,我跳过了前几个而忽略了最后一个。如果数据发生更改,这显然会中断。