我在选择单个节点时遇到错误

时间:2015-12-02 08:41:29

标签: c# xml

编辑:我认为原因是因为" 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");

2 个答案:

答案 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!