2013-10-04 63 views
0

我知道這是一個非常基本的問題,但我是XML新手,雖然看起來很簡單,但我無法在任何地方找到簡單的答案。我有一個看起來像這樣的XML文檔:選擇XML的子集

<?xml version="1.0" encoding="UTF-8"?> 
<root version="1"> 
<targets> 
    <target type="email"> 
     <property name="to">[email protected]</property> 
    </target> 
    <target type="fob"/> 
</targets> 
<observation uniqueID="00A60D" deviceID="308610ea23"> 
    <field name="field1">test1</field> 
    <field name="field2">test2</field> 
</observation> 

,我想無論是選擇XML的一個子集,或刪除節點,把它簡化到:

<observation uniqueID="00A60D" deviceID="308610ea23"> 
    <field name="attachments"> 
     <string>1910.jpg</string> 
    </field> 
    <field name="field1">test1</field> 
    <field name="field2">test2</field> 
</observation> 

這樣我就可以將它反序列化成一個對象。任何幫助是極大的讚賞。

+3

你「子集」似乎並沒有成爲一個子集' 1910.jpg '不會在原始XML中顯示。同樣在您的嚴謹XML中,''元素未關閉,因此格式不正確,我認爲這是複製粘貼錯誤。 –

+0

似乎你應該更多地澄清你的問題。 1910.jpg從哪裏來? –

回答

1

可以使用XPath:

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
     "<root version=\"1\">" + 
     "<targets>" + 
      "<target type=\"email\">" + 
       "<property name=\"to\">[email protected]</property>" + 
      "</target>" + 
      "<target type=\"fob\"/>" + 
     "</targets>" + 
     "<observation uniqueID=\"00A60D\" deviceID=\"308610ea23\">" + 
      "<field name=\"field1\">test1</field>" + 
      "<field name=\"field2\">test2</field>" + 
     "</observation>" + 
     "</root>"; 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 

XmlElement root = doc.DocumentElement; 
var observationNode = root.SelectSingleNode("/root/observation"); 

var observationXml = observationNode.OuterXml; 
+1

我很接近,但沒有意識到我需要使用.OuterXml,這是一個抓住。 – TrevorGoodchild

0
XElement root = XElement.Parse("<root version ..." // etc. to parse a string. 
// Use XElement.Load to load a file. 

var observations = root.Elements("observation"); 

它假定一個根(根據定義)以及可能有多個observation元件。

1

這裏是一個XML到LINQ版本:

dynamic root= XElement.Load(dataStream).Descendants("root") 
         .Select(element => element.Value).ToArray(); 

這將使從document.And所有root元素,您可以訪問根

+0

爲什麼「動態」?它不只是'XElement []'?或'var'用於類型推斷? –

+0

之後,您可以通過其名稱訪問元素 – Nirmal

+0

我喜歡這個解決方案,但我更新的Lambda表達式,所以我試圖儘可能簡單,對我來說,無論如何,暫時。感謝您的迴應。 – TrevorGoodchild