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");

I选择单个节点时遇到错误

如果您有默认名称空间,则需要使用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,如下所述!