Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlReader如何读取空元素?_C#_Xml_Xmlreader - Fatal编程技术网

C# 使用XmlReader如何读取空元素?

C# 使用XmlReader如何读取空元素?,c#,xml,xmlreader,C#,Xml,Xmlreader,我已经使用XmlWriter编写了一个Xml文件。 代码如下: public void WriteXml(XmlWriter writer) { writer.WriteStartElement("element1"); writer.WriteAttributeString("attrs1", Attrs1); writer.WriteAttributeString("attrs2", Attrs2);

我已经使用XmlWriter编写了一个Xml文件。 代码如下:

public void WriteXml(XmlWriter writer)
        {
            writer.WriteStartElement("element1");
            writer.WriteAttributeString("attrs1", Attrs1);
            writer.WriteAttributeString("attrs2", Attrs2);

            if (!string.IsNullOrWhiteSpace("element2"))
            {
                writer.WriteStartElement("element2");
                writer.WriteCData(Element2);
                writer.WriteEndElement();
            }
            if (!string.IsNullOrWhiteSpace("element3"))
            {
                writer.WriteStartElement("element3");
                writer.WriteCData(Element3);
                writer.WriteEndElement();
            }
            Element4.WriteXml(writer);
            Element5.WriteXml(writer);

            writer.WriteEndElement();            
        }
如您所见,element4调用了一个名为“WriteXml()”的方法。以下是该方法:

public void WriteXml(XmlWriter writer)
        {
            if (m_PropertyValueList.Count > 0)
            {
                writer.WriteStartElement("element4");

                foreach (var p in m_PropertyValueList)
                {
                    if (p.CurrentValue != null)
                    {
                        writer.WriteStartElement("property");
                        writer.WriteAttributeString("name", p.PropertyName);
                        writer.WriteAttributeString("value", p.CurrentValue.ToString());
                        writer.WriteEndElement();
                    }
                }    
                writer.WriteEndElement();
            }
        }
public void ReadXml(XmlReader reader)
        {
            if ((reader.IsStartElement("element4")) && (!reader.IsEmptyElement))
            {
                reader.Read();

                while (reader.IsStartElement("property"))
                {
                    string propertyName = reader.GetAttribute("name");
                    string propertyValue = reader.GetAttribute("value");
                    SetValue(propertyName, propertyValue);
                    reader.Read();
                }

                //
                //  Read </element4>
                //
                reader.MoveToContent();
                reader.ReadEndElement();
            }            
        }
请注意,它检查p.CurrentValue!=无效的如果为null,则该元素应作为空元素写入。在本例中,p.CurrentValue为null,因此我确实需要一个空元素。您将在下面的Xml输出中看到,该输出将此元素编写为。对我来说,它似乎正确地写入了一个空元素,如果我在这里错了,请纠正我

Xml文件输出如下所示:

<?xml version="1.0" encoding="UTF-8"?>

-<element>   
    -<element 1 attrs1="Some Info" attrs2="More Info">   
        -<element2>    
            +<![CDATA[]]>
        </element2>   
        -<element3>    
            -<![CDATA[ ]]>
        </element3>    
        <element4/>    
    </element1>    
</element>
因此,我的问题是:

  • 这是因为元素为空吗?如果是,如何关闭或读取空元素
  • 如果元素4是起始元素,并且不是空的,那么我将读取它……如果我删除(!reader.IsEmptyElement),我将得到一个无限循环。它继续调用Element4.ReadXml(reader)。为什么会这样
  • 如何修复并继续执行此操作,以便读取其余元素
    当我从xml文件中读取元素时,我需要添加另一个else if条件来处理元素是否为start元素以及元素是否为空。我只是检查它是否是空的。所以它不知道如何处理它是空的。然后,当这些条件得到满足时,我只需执行reader.Read()命令应用程序按原样读取元素

    下面是它的外观:

    else if (reader.IsStartElement("element4")) && (reader.IsEmptyElement))
        {
            reader.Read();
        }
    

    1) 你能把你的问题简化成一个简单的问题吗?它相当复杂,但也不完整,因为我们不能只是复制/粘贴到VisualStudio中并运行。2) 你退房了吗对不起,这是我能做的最简单的了。我已经排除了用于读取和写入xml文件的测试方法。我想出来了。我在下面为感兴趣的人提供了一个解决方案。一个大问题的简单解决方案。
    "Message: TestMethod myTestMethodName threw exception: System.Xml.XmlException 'Element' is an invalid XmlNodeType. Line 8, position 6."  
    
    else if (reader.IsStartElement("element4")) && (reader.IsEmptyElement))
        {
            reader.Read();
        }