Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 我无法将数据从XML文件移动到CDATA节点类型的数组中_C#_.net_Xml_Xmlreader_Cdata - Fatal编程技术网

C# 我无法将数据从XML文件移动到CDATA节点类型的数组中

C# 我无法将数据从XML文件移动到CDATA节点类型的数组中,c#,.net,xml,xmlreader,cdata,C#,.net,Xml,Xmlreader,Cdata,根据标题,我在从包含CDATA元素的XML文件获取数据到数组中时遇到问题。 基于我目前对如何做的有限理解,我提出了这个基本的工作方法 CDATA很奇怪,所以我的常规方法不起作用。我寻找节点的正常路线并没有在它们上面停下来,然后是整个CDATA问题 XmlTextReader xmlReader = new XmlTextReader(FilePath); while (xmlReader.Read()) { // Position the reader on the OrderNumbe

根据标题,我在从包含
CDATA
元素的XML文件获取数据到数组中时遇到问题。 基于我目前对如何做的有限理解,我提出了这个基本的工作方法
CDATA
很奇怪,所以我的常规方法不起作用。我寻找节点的正常路线并没有在它们上面停下来,然后是整个
CDATA
问题

XmlTextReader xmlReader = new XmlTextReader(FilePath);
while (xmlReader.Read())
{
    // Position the reader on the OrderNumber node
    xmlReader.ReadToFollowing("quoteNumber");
    XmlReader inner = xmlReader.ReadSubtree();
    while (inner.Read())
    {
        switch (xmlReader.NodeType)
        {
            case XmlNodeType.CDATA:
                Globals.COData[0] = inner.Value;
                break;
        }
    }

    xmlReader.ReadToFollowing("orderNumber");
    inner = xmlReader.ReadSubtree();
    while (inner.Read())
    {
        switch (xmlReader.NodeType)
        {
            case XmlNodeType.CDATA:
                Globals.COData[1] = inner.Value;
                break;
        }
    }

但是我有很多数据元素要获取,并且假设有更好的方法。文件看起来像:

及有关部分:

<quoteNumber>
<![CDATA[ John Test 123]]>
</quoteNumber>
<orderNumber>
<![CDATA[ 1352738]]> 
</orderNumber>

所包含的项在文件末尾没有结束元素。整个XML太大,无法发布

XML格式不在我的控制范围内


我的最终目标是将
OrderNumber
及其值放入数组中。以及
报价编号
及其值。我习惯于看到
123
,因此
CDATA
节点对我来说是新的。

不完全清楚哪里出了问题,因为您没有共享完整的XML,但您没有从
Read()
循环内部检查返回值。因此,一旦您阅读了最后一个
,当未找到另一个
时,您将得到一个异常

我建议您按如下方式重组代码:

var ns = ""; // Replace with @"http://intelliquip.com/integrationS..." can't see the full namespace from the XML image.
var list = new List<Tuple<string, string>>(); // List of (quoteNumber, orderNumber) values.
var xmlReader = XmlReader.Create(FilePath);
while (xmlReader.ReadToFollowing("quoteNumber", ns))
{
    string quoteNumber = null;
    string orderNumber = null;
    using (var inner = xmlReader.ReadSubtree())
    {
        // We need to skip the insignificant whitespace around the CDATA nodes which ReadElementContentAsString() will not do.
        while (inner.Read())
        {
            switch (xmlReader.NodeType)
            {
                case XmlNodeType.Text:
                case XmlNodeType.CDATA:
                    quoteNumber += inner.Value;
                    break;
            }
        }
        // After ReadSubtree() the reader is positioned on the </quoteNumber> element end.
    }
    // If the next orderNumber node is nmissing, ReadToFollowing() will read all the way past the next quoteNumber node.  
    // Use ReadToNextSibling() instead.
    if (xmlReader.ReadToNextSibling("orderNumber", ns))
    {
        using (var inner = xmlReader.ReadSubtree())
        {
            while (inner.Read())
            {
                switch (xmlReader.NodeType)
                {
                    case XmlNodeType.Text:
                    case XmlNodeType.CDATA:
                        orderNumber += inner.Value;
                        break;
                }
            }
        }
    }

    if (quoteNumber != null && orderNumber != null)
        list.Add(Tuple.Create(quoteNumber, orderNumber)); 
    else
    {
        // Add error handling here
    }
}
 var doc = XDocument.Load(FilePath);
 XNamespace ns = ""; // Replace with @"http://intelliquip.com/integrationS..." can't see the full namespace from the XML image.
 var query = from quote in doc.Descendants(ns + "quoteNumber")
     let order = quote.ElementsAfterSelf(ns + "orderNumber").FirstOrDefault()
     where order != null
     select Tuple.Create(quote.Value, order.Value);

 var list = query.ToList();
这看起来简单多了

<> >您也可以考虑用一个适当的数据模型,如

替换<代码>元组< /代码>。
public class Order
{
    public string QuoteNumber { get; set; }
    public string OrderNumber { get; set; }
}

演示小提琴#1用于
XmlReader
和#2用于linqtoxml。

问题附加注释作者:我的最终目标是将“OrderNumber”及其值放入数组中。以及“报价编号”及其值。我的问题不是很清楚。我习惯于看到123,所以这对我来说是新的。XML的图像没有什么用处,只是表明元素位于某个根默认名称空间中,而该名称空间没有完全显示出来。您是否有可能编辑您的问题,将“原始”XML作为文本包含,而不进行任何转义或重新格式化?例如,在实际的XML中,
注释是否被无关紧要的空格所包围,或者这是您如何设置问题格式的产物?非常感谢,我将仔细研究这些建议,看看我能想出什么。我的代码是可怕的,永远不会发布到生产-正在寻找方向。我将得到大约20个元素,然后还要遍历行项目。
ReadSubtree()
对于通过复杂的XML进行流式处理非常有用,它保证您不能读得太少或太多。例如,如果您希望搜索某个名称的元素,然后通过其子元素流式查找某个内容,则可以使用
XmlReaderExtensions.ReadAllSubtrees(此XmlReader阅读器、字符串localName、字符串namespaceURI)
从中枚举。