2015-12-02 63 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!