C# 节点可能存在也可能不存在时的XML解析 请考虑下面的示例XML。我有一个类say Dummy,它包含两个字段X和Y。通过XML解析,我希望构建该类的对象列表。X和Y分别取X和Y标记的值,它们仅位于B父节点内。在XML中,X和Y节点可能存在于B节点内部,也可能不存在于B节点内部 <DOC> <A>1</A> <B> <C>1</C> <D>1</D> <E>1</E> <X>Hello</X> <F>1</F> <G>1</G> <Y>Hi</Y> </B> <B> <C>1</C> <D>1</D> <E>1</E> <F>1</F> <G>1</G> </B> <H> <X>1</X> //ignore <Y>1</Y> //ignore </H> <DOC> 1. 1. 1. 1. 你好 1. 1. 你好 1. 1. 1. 1. 1. 1//忽略 1//忽略

C# 节点可能存在也可能不存在时的XML解析 请考虑下面的示例XML。我有一个类say Dummy,它包含两个字段X和Y。通过XML解析,我希望构建该类的对象列表。X和Y分别取X和Y标记的值,它们仅位于B父节点内。在XML中,X和Y节点可能存在于B节点内部,也可能不存在于B节点内部 <DOC> <A>1</A> <B> <C>1</C> <D>1</D> <E>1</E> <X>Hello</X> <F>1</F> <G>1</G> <Y>Hi</Y> </B> <B> <C>1</C> <D>1</D> <E>1</E> <F>1</F> <G>1</G> </B> <H> <X>1</X> //ignore <Y>1</Y> //ignore </H> <DOC> 1. 1. 1. 1. 你好 1. 1. 你好 1. 1. 1. 1. 1. 1//忽略 1//忽略,c#,xml,C#,Xml,对于上面的XML,我希望列表包含两个元素。第一组有“你好”、“你好”,另一组有“你好” 我的C#解析代码看起来像这样 List<Dummy> dummyList = new List<Dummy>(); Dummy d = null; while (xmlReader.Read()) { if (xmlReader.IsStartElement()) { switch (x

对于上面的XML,我希望列表包含两个元素。第一组有“你好”、“你好”,另一组有“你好”

我的C#解析代码看起来像这样

List<Dummy> dummyList = new List<Dummy>();
Dummy d = null;

 while (xmlReader.Read())
        {
            if (xmlReader.IsStartElement())
            {
                switch (xmlReader.Name)
                {
                   case "B":
                            d = new Dummy();
                            while(xmlReader.Name != "X")
                                xmlReader.Read();   // can go into infinite loop if there is no X node
                            xmlReader.Read();
                            d.X = xmlReader.Value;

                            while(xmlReader.Name != "Y")
                                xmlReader.Read();  // can go into infinite loop if there is no Y node
                            xmlReader.Read();
                            d.Y = xmlReader.Value;

                            dummyList.Add(d);
                            d = null;
                            break;
              }
       }
 }
List dummyList=new List();
虚拟d=空;
while(xmlReader.Read())
{
if(xmlReader.IsStartElement())
{
开关(xmlReader.Name)
{
案例“B”:
d=新假人();
而(xmlReader.Name!=“X”)
xmlReader.Read();//如果没有X节点,则可以进入无限循环
Read();
d、 X=xmlReader.Value;
while(xmlReader.Name!=“Y”)
xmlReader.Read();//如果没有Y节点,则可以进入无限循环
Read();
d、 Y=xmlReader.Value;
添加(d);
d=零;
打破
}
}
}
上述代码对于第一个B节点可以正常工作,但对于第二个B节点不会出现故障。
请告诉我您的想法。

第二个B节点出现故障是什么意思

正如我在第二个B节点中看到的,你们并没有任何X或Y。这意味着当它进入开关和案例“B”时,你们开始while循环,直到它找到不再存在的X为止。所以它一直读到最后,什么也没发生。您必须只读到B节点的末尾(这将确保您的无限循环),如果没有X和Y,您必须手动为它们创建空字符串

bool waitingForXy = false;
while (xmlReader.Read())
{
    if (xmlReader.IsStartElement())
    {
        switch (xmlReader.Name)
        {
            case "B":
                d = new Dummy();
                waitingForXy = true;
                break;
            case "X":
                if (waitingForXy)
                {
                    d.X = xmlReader.ReadString();
                }
                break;
            case "Y":
                if (waitingForXy)
                {
                    d.Y = xmlReader.ReadString();
                }
                break;
        }
    }
    else if (xmlReader.NodeType == XmlNodeType.EndElement)
    {
        switch (xmlReader.Name)
        {
            case "B":
                waitingForXy = false;
                dummyList.Add(d);
                break;
        }
    }
}

这将在每个
开始元素上创建一个虚拟实例,并等待
出现,直到
结束元素。如果它们没有出现,
d.X
d.Y
将保持为空。

如果您使用的是VS2013 SP2或更高版本,您可以使用
编辑->粘贴特殊->将XML粘贴为类
将强类型类从原始XML复制并粘贴到代码中。注意:您必须关闭您的最终
,并删除注释才能使其生效

然后,可以使用以下代码将XML中任何B中的任何X和Y值提取到元组集合中:

string xml = // TODO: Get XML as string.
var myXml = (DOC)new XmlSerializer(typeof(DOC)).Deserialize(new StringReader(xml));
var results = myXml.B.Select(x => Tuple.Create(x.X, x.Y));

这个代码失败了吗?请提供。在源代码中,首先搜索“X”,然后搜索“Y”。你是故意这么做的吗?