2015-12-02 62 views
0

編輯:我認爲原因是因爲「UniversalShipment」xmlns。有一個鏈接,但我刪除它的機密性。我無法通過該節點。幫助我在ChooseSingleNode時遇到錯誤

這是我的XML。

<UniversalInterchange xmlns="" version="1.0"> 
     <Header> 
     <SenderID>1</SenderID> 
     <RecipientID>2</RecipientID> 
     </Header> 
     <Body> 
     <UniversalShipment xmlns="" version="1.1"> 
      <Shipment> 
      <CustomizedFieldCollection> 
       <CustomizedField> 
        <Key>Documents Checked</Key> 
        <DataType>Boolean</DataType> 
        <Value>false</Value> 
       </CustomizedField> 
       <CustomizedField> 
        <Key>Date Completed</Key> 
        <DataType>DateTime</DataType> 
        <Value></Value> 
       </CustomizedField> 
      </CustomizedFieldCollection> 
      </Shipment> 
     </UniversalShipment> 
     </Body> 
    </UniversalInterchange> 

當我得到單節點時,我收到null。但是,當我嘗試「身體」只在單個節點它添加到底部。如果我試圖將其添加到UniversalShipment「Body/UniversalShipment」,它會遇到錯誤。

XmlDocument doc=new XmlDocument(); 
    doc.Load("sample.xml"); 
    XmlNode customizedNode = doc.CreateElement("CustomizedField"); 
       XmlNode keyNode = doc.CreateElement("Key"); 
       XmlNode dataNode = doc.CreateElement("DataType"); 
       XmlNode valueNode = doc.CreateElement("Value"); 
       keyNode.InnerText = "hi"; 
       dataNode.InnerText = "hello"; 
       valueNode.InnerText = "bye"; 
       customizedNode.AppendChild(keyNode); 
       customizedNode.AppendChild(dataNode); 
       customizedNode.AppendChild(valueNode); 
       doc.DocumentElement.SelectSingleNode("Body/UniversalShipment/Shipment/CustomizedFieldCollection").AppendChild(customizedNode); 
    doc.Save("sample.xml"); 
+0

從根開始表達或「/」文檔元素是這樣的:UniversalInterchange/Body/UniversalShipment/Shipment/CustomizedFieldCollection。我沒有嘗試過,但它應該工作。 – seesharpconcepts

+0

@seesharpconcepts「UniversalInterchange/Body/UniversalShipment/Shipment/CustomizedFieldCollection」我仍然遇到錯誤。我認爲這是因爲xmlns。有一個鏈接提供,但我刪除它。我無法顯示給你的鏈接。 – Reynan

+0

上面的Xpath在沒有聲明名稱空間的情況下工作。初始化XmlNamespaceManager並將其作爲參數傳遞給Select方法。鏈接到msdn:https://msdn.microsoft.com/en-us/library/h0hw012b(v=vs.110).aspx – seesharpconcepts

回答

1

如果您有默認的命名空間,您將需要使用XmlNamespaceManager - 但是,您有兩個默認命名空間,因此它有點複雜。

正如你已經完全刪除從你的問題的命名空間的URI我發明我自己:

<UniversalInterchange xmlns="firstdefaultnamespace" version="1.0"> 
    <Header> 
    <SenderID>1</SenderID> 
    <RecipientID>2</RecipientID> 
    </Header> 
    <Body> 
    <UniversalShipment xmlns="seconddefaultnamespace" version="1.1"> 
     <Shipment> 
     <CustomizedFieldCollection> 
      <CustomizedField> 
       <Key>Documents Checked</Key> 
       <DataType>Boolean</DataType> 
       <Value>false</Value> 
      </CustomizedField> 
      <CustomizedField> 
       <Key>Date Completed</Key> 
       <DataType>DateTime</DataType> 
       <Value></Value> 
      </CustomizedField> 
     </CustomizedFieldCollection> 
     </Shipment> 
    </UniversalShipment> 
    </Body> 
</UniversalInterchange> 

如果你的第一個默認的命名空間爲firstdefaultnamespace一個URI和你的第二個默認命名空間有seconddefaultnamespace一個URI你可以這樣做:

XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
    ns.AddNamespace("ns1", "firstdefaultnamespace"); 
    ns.AddNamespace("ns2", "seconddefaultnamespace"); 

    doc.DocumentElement.SelectSingleNode("ns1:Body/ns2:UniversalShipment/ns2:Shipment/ns2:CustomizedFieldCollection", ns).AppendChild(customizedNode); 

但是,您將有問題,當您保存XML新將XMLNode - 你不與任何命名空間,這樣它會用新的默認命名空間可以保存創建它,這將overri de UniversalShipment元素上的默認名稱空間。

我強烈建議您閱讀有關XML命名空間的更多信息。

如果你想創建你的元素,讓他們內部默認的命名空間中,你需要做這樣的事情:

const string FirstNamespaceUri = "firstdefaultnamespace"; 
    const string SecondNamespaceUri = "seconddefaultnamespace"; 
    XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
    ns.AddNamespace("ns1", FirstNamespaceUri); 
    ns.AddNamespace("ns2", SecondNamespaceUri); 

    XmlNode customizedNode = doc.CreateElement("CustomizedField", SecondNamespaceUri); 
    XmlNode keyNode = doc.CreateElement("Key", SecondNamespaceUri); 
    XmlNode dataNode = doc.CreateElement("DataType", SecondNamespaceUri); 
    XmlNode valueNode = doc.CreateElement("Value", SecondNamespaceUri); 
    keyNode.InnerText = "hi"; 
    dataNode.InnerText = "hello"; 
    valueNode.InnerText = "bye"; 
    customizedNode.AppendChild(keyNode); 
    customizedNode.AppendChild(dataNode); 
    customizedNode.AppendChild(valueNode); 

    doc.DocumentElement.SelectSingleNode("ns1:Body/ns2:UniversalShipment/ns2:Shipment/ns2:CustomizedFieldCollection", ns).AppendChild(customizedNode); 
+0

謝謝你matt的作品:) – Reynan

+0

@Reynan如果這回答你的問題,你能接受它作爲答案? –

+0

完成。謝謝 – Reynan

0

XPath表達式在您的情況下未正確形成。檢查此鏈接的XPath指南:http://www.w3schools.com/xsl/xpath_syntax.asp

工作的Xpath: doc.DocumentElement.SelectSingleNode( 「身體/ UniversalShipment /發貨/ CustomizedFieldCollection」)的appendChild(customizedNode);

如果在XML中指定了名稱空間,則可以按照here的解釋將XmlNamespaceManager傳遞給XmlNode.SelectSingleNode!