2017-03-31 92 views
1

具有這樣的XML替換字符的的XDocument的嵌套元件陣列:樞軸和具有單串

<ReplyMessage> 
    <tran> 
    <ser_num>305</ser_num> 
    <time>1490987995</time> 
    <source_type>0</source_type> 
    <source_number>0</source_number> 
    <tran_type>126</tran_type> 
    <tran_code>50</tran_code> 
    <t_diag> 
     <bfr>S</bfr> 
     <bfr>o</bfr> 
     <bfr>c</bfr> 
     <bfr>k</bfr> 
     <bfr>e</bfr> 
     <bfr>t</bfr> 
     <bfr></bfr> 
     <bfr>r</bfr> 
     <bfr>e</bfr> 
     <bfr>c</bfr> 
     <bfr>v</bfr> 
     <bfr></bfr> 
     <bfr>o</bfr> 
     <bfr>n</bfr> 
     <bfr></bfr> 
     <bfr>s</bfr> 
     <bfr>o</bfr> 
     <bfr>c</bfr> 
     <bfr>k</bfr> 
     <bfr>e</bfr> 
     <bfr>t</bfr> 
     <bfr>-</bfr> 
     <bfr>7</bfr> 
     <bfr>4</bfr> 
     <bfr>:</bfr> 
     <bfr></bfr> 
     <bfr>f</bfr> 
     <bfr>a</bfr> 
     <bfr>i</bfr> 
     <bfr>l</bfr> 
     <bfr>e</bfr> 
     <bfr>d</bfr> 
     <bfr></bfr> 
     <bfr>-</bfr> 
     <bfr></bfr> 
     <bfr>3</bfr> 
     <bfr>0</bfr> 
     <bfr>7</bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
     <bfr></bfr> 
    </t_diag> 
    </tran> 
</ReplyMessage> 

我希望用一個簡單的字符串元素來替換<t_diag>下嵌套<bfr>元件陣列:

<ReplyMessage> 
    <tran> 
    <ser_num>305</ser_num> 
    <time>1490987995</time> 
    <source_type>0</source_type> 
    <source_number>0</source_number> 
    <tran_type>126</tran_type> 
    <tran_code>50</tran_code> 
    <t_diag> 
     <bfr>Socket recv on socket-74: failed - 307</bfr> 
    </t_diag> 
    </tran> 
</ReplyMessage> 

因此,從StackOverflow和MSDN拼接幾個帖子,我到達了這種方法,它的工作:

private XElement XmlPivotCharArrayToStr(XDocument xmlDoc, string parentName, string arrayName) 
{ 
    XElement parent = xmlDoc.Descendants().Where(n => n.Name == parentName).FirstOrDefault(); 
    string st = string.Join("", parent.Elements(arrayName).Select(x => string.IsNullOrEmpty(x.Value) ? " " : x.Value)).TrimEnd(); 
    parent.RemoveAll(); 
    XElement newElement = new XElement(arrayName, st); 
    parent.Add(newElement); 
    return newElement; 
} 

這樣調用:

//// Some initial cleanup to convert character array into string 
    XmlPivotCharArrayToStr(xmlDoc, parentName: "t_diag", arrayName: "bfr"); 

現在,這個工作,在我的特定情況下,但我的感覺是幾個可以作出改進:

  1. 有沒有一種方法,我可以有指定了一個到parentName的顯式路徑,而不是使用.Descendants()方法?
  2. 有沒有更好的方法來換出數組並將其替換爲字符串? - parent.RemoveAll()可能矯枉過正。
  3. 是否有檢測數組的結束(),以避免使用TrimEnd提前

感謝任何提示的方式 - 我希望其他人發現(改進版),這是有用的。

回答

1
  1. 您可以使用xpath選擇目標節點。爲此,請使用擴展方法(添加using System.Xml.XPath)。然後,只需:

    XElement parent = xmlDoc.XPathSelectElement(path); 
    

path你的情況是"/ReplyMessage/tran/t_diag"

  • 我覺得RemoveAll是好的,但如果你有疑問 - 你可以刪除t_diag本身,就像這樣:

    XElement newElement = new XElement(arrayName, st); 
    var grandParent = parent.Parent; 
    parent.Remove(); 
    grandParent.Add(new XElement(parent.Name, newElement)); 
    
  • TrimEnd是罰款。要檢測最後的所有元素是否都是空的,無論如何都需要全部觀察 - 所以你不能做得更好。

  • +0

    謝謝,這是偉大的建議 – kpkpkp