I选择单个节点时遇到错误
本文关键字:遇到 错误 节点 选择 单个 | 更新日期: 2023-09-27 18:25:15
编辑:我认为原因是因为"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。但当我只在单个节点中尝试"Body"时,它会添加到底部。如果我试图将其添加到UniversalShipment"Body/UniversalShipping"中,它会遇到错误。
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");
如果您有默认名称空间,则需要使用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
,而第二个默认命名空间为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);
但是,使用新的XmlNodes保存XML时会出现问题——您没有使用任何命名空间创建它,因此它将使用新的默认命名空间保存,该命名空间将覆盖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);
XPath表达式的格式不正确。请查看此链接以获取XPath指南:http://www.w3schools.com/xsl/xpath_syntax.asp
工作Xpath:文件。DocumentElement.SelectSingleNode("Body/UniversalShipment/Shipment/CustomizedFieldCollection").AppendChild(customizedNode);
如果在XML中指定了命名空间,则可以将XmlNamespaceManager传递给XmlNode.SelectSingleNode,如下所述!