为什么我的 xml 文档被视为一个元素

本文关键字:一个 元素 xml 我的 文档 为什么 | 更新日期: 2023-09-27 18:22:17

我正在尝试将 xml 文件加载到xmlDocument中,但收到错误,指出它无法转换xmlelement to a xmldocument为什么?

.XML

<VR>
  <SubscriberID>xxxx</SubscriberID>
  <EmailAddress>m@gmail.com</EmailAddress>
  <FirstName>m</FirstName>
  <LastName>x</LastName>
  <State>CO</State>
  <Country/>
  <BirthDate>11/16/3004</BirthDate>
  <SendEmail>False</SendEmail>
  <Preference Value="true" Key="life"/>
  <Preference Value="true" Key="yo"/>
</VR>

C# 测试

        preferenceHelper target = new preferenceHelper(); // TODO: Initialize to an appropriate value
        XmlDocument docIn = new XmlDocument();
        docIn.Load(@"C:/INTG/trunk/src/VRI.Integration.Email/Test/xmlIn.xml");
        XmlDocument expected = null; // I know this will fail in the test, but it should compile, right?
        XmlDocument actual;
        actual = target.preferencesXmlDoc(docIn);
        Assert.AreEqual(expected, actual);
        Assert.Inconclusive("Verify the correctness of this test method.");

C# 函数

public class preferenceHelper
    {
        public preferenceHelper() { }
        XmlDocument docOut = new XmlDocument();
        public XmlDocument preferencesXmlDoc(XmlDocument docIn)
        {
            foreach (XmlDocument root in docIn.SelectNodes("//VR"))
            {
                foreach (XmlDocument node in root.SelectNodes("//Preference"))
                {
                    XmlNode Name = docIn.CreateElement("Name");
                    Name.InnerText = node.InnerText = node.Attributes["Key"].Value;
                    XmlNode Value = docIn.CreateElement("Value");
                    Value.InnerText = node.InnerText = node.Attributes["Value"].Value;
                    docOut.CreateElement("Property").AppendChild(Name).AppendChild(Value);
                }
            }
            return docOut;
        }
    }

错误

Test method Test.preferenceHelperTest.preferencesXmlDocTest threw exception: 
System.InvalidCastException: Unable to cast object of type 'System.Xml.XmlElement' to type 'System.Xml.XmlDocument'.

如果需要,我不会向 xmlIn 添加命名空间 - 如何在我的 xml 文件中加载?

失败的地方:actual = target.preferencesXmlDoc(docIn);

谢谢

为什么我的 xml 文档被视为一个元素

您的问题在于以下语句:

foreach (XmlDocument root in SelectNodes(...))

foreach 将序列中的每个值隐式强制转换为指定的类型。该语句扩展为:

using(var e = sequence.GetEnumerator())
{
    while (e.MoveNext())
    {
        XmlDocument v = (XmlDocument)e.Current;
        // loop body
    }
}

这在InvalidCastException崩溃的原因是您选择的节点类型是 XmlElement ,而不是 XmlDocument 。要解决此问题,只需将 foreach 语句中的类型切换为 XmlElement 即可。

您还可以通过使用 XPath 访问首选项元素来提高可读性,将两个循环替换为单个:

foreach (XmlElement node in docIn.SelectNodes("/VR/Preference"))

您的外部SelectNodes循环实际上是完全冗余的//Preference因为它已经从文档的根目录中获取所有Preference后代,而不仅仅是从特定的子 VR 中获取。

proplem在这里:

foreach (XmlDocument root in docIn.SelectNodes("//VR"))

在这里:

foreach (XmlDocument node in root.SelectNodes("//Preference"))



XmlNode.SelectNodes()返回一个XmlNodeList,这是XmlNodesIEnumerable。它不会包含任何XmlDocument



所以这样做:

foreach (XmlNode root in docIn.SelectNodes("//VR"))

而这个:

foreach (XmlElement node in root.SelectNodes("//Preference"))

XmlDocument.SelectNodes("//VR"( 返回 XmlNodeList,而不是 XmlDocument。因此,至少您需要将代码更改为:

public XmlDocument preferencesXmlDoc(XmlDocument docIn)
{
    foreach (XmlNode root in docIn.SelectNodes("//VR"))
    {
        foreach (XmlNode node in root.SelectNodes("//Preference"))
        {

文档通常有一个标题:

<?xml version="1.0"?>

如果没有标头,它被视为一个元素。

尝试添加一个。