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)
从中枚举。