编辑:我认为原因是因为" UniversalShipment" XMLNS。有一个链接,但我删除它的机密性。我无法通过该节点。帮助
这是我的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>
获取singlenode时收到null。但当我尝试&#34; Body&#34;只在单个节点中添加到底部。如果我试图将它添加到UniversalShipment&#34; Body / UniversalShipment&#34;它遭遇和错误。
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 :(得分: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>
如果您的第一个默认命名空间的URI为firstdefaultnamespace
,而您的第二个默认命名空间的URI为seconddefaultnamespace
,则可以执行以下操作:
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);
但是,使用新的XmlNode保存XML时会遇到问题 - 您没有使用任何命名空间创建它,因此它将使用新的默认命名空间保存,这将覆盖{{1}上的默认命名空间} element。
我强烈建议您阅读有关XML命名空间的更多信息。
如果您想创建元素并将它们保留在内部默认命名空间中,您需要执行以下操作:
UniversalShipment
答案 1 :(得分:0)
在您的情况下,XPath表达式无法正确形成。请查看此链接以获取XPath指南:http://www.w3schools.com/xsl/xpath_syntax.asp
使用Xpath: doc.DocumentElement.SelectSingleNode(&#34;车身/ UniversalShipment /装运/ CustomizedFieldCollection&#34)。使用appendChild(customizedNode);
如果在XML中指定了名称空间,则可以按照here的说明将XmlNamespaceManager传递给XmlNode.SelectSingleNode!