C# 从文件中读取xml
我在从xml文件读取信息时遇到了一个小问题 传递给我的文件有数千行。我只对其中的300-400行感兴趣。当用户完成操作后,我不需要将任何数据写回xml,要读取的数据可以存储在C# 从文件中读取xml,c#,xml,C#,Xml,我在从xml文件读取信息时遇到了一个小问题 传递给我的文件有数千行。我只对其中的300-400行感兴趣。当用户完成操作后,我不需要将任何数据写回xml,要读取的数据可以存储在列表中 我在网上找到了使用XmlTextReader读取数据的解决方案。因此,我不必创建类并使用序列化程序。但我似乎用错了XmlTextReader。也许你能帮我 这是xml的外观: <?xml version="1.0" encoding="utf-8"?> <ProjectConfiguration x
列表中
我在网上找到了使用XmlTextReader
读取数据的解决方案。因此,我不必创建类并使用序列化程序。但我似乎用错了XmlTextReader
。也许你能帮我
这是xml的外观:
<?xml version="1.0" encoding="utf-8"?>
<ProjectConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi="http://www.w3.org/2001/XMLSchema-instance">
<ProjectLists xmlns="...">
<ProjectList>
... // not interested in this data
</ProjectList>
<ProjectList>
<ListNode>
<Name>Test_Environment</Name>
<Children>
<ListNode>
<Name>yyy</Name>
<Children>
<ListNode>
<Name>205 (ST)</Name>
<Children>
<ListNode>
<Name>098-0031</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0032</Name>
<Children />
</ListNode>
//more ListNodes...
</Children>
</ListNode>
<ListNode>
<Name>old</Name>
<Children>
<ListNode>
<Name>W098-32</Name>
<Children />
</ListNode>
</Children>
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>xxx</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0001</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0011</Name>
<Children />
</ListNode>
// More List Nodes
</Children>
</ListNode>
<ListNode>
// more List Nodes
</ListNode>
</ProjectList>
<ProjectList>
//more uninteresting ProjectLists...
</ProjectList>
但是条件reader.Name==“Children”
永远不会被填满。。。有人能给我解释一下原因吗。也许能给我一个简单的方法来把这些值存储在列表中
?提前谢谢
编辑:我编辑了xml。对此很抱歉,但要从我的xml中过滤不必要的混乱部分真的很难…这有帮助吗?:)
stringpath=@“path.xml”;
if(File.Exists(path)){
XmlTextReader=新的XmlTextReader(路径);
控制台。写线(“”);
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
控制台。写(“”);
打破
案例XmlNodeType.Text:
Console.WriteLine(reader.Value);
打破
案例XmlNodeType.EndElement:
控制台。写(“”);
打破
}
}
Console.ReadLine();
}否则{
Console.WriteLine(“未找到错误文件”);
}
这是什么语言?通过使用标记,您可以像JSON一样遍历XML。使用LinqToXml
var xDocument = XDocument.Parse("yourXmlString");
XNamespace ns = xDocument.Root.GetDefaultNamespace();
var result = (from e in xDocument
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode")
select e.Element(ns + "Name").Value).ToList();
私有静态空白填充名(XElement容器,列表结果)
{
XElement[]listNodes=container.Elements(“ListNode”).ToArray();
如果(!listNodes.Any())
返回;
foreach(listNodes中的XElement listNode)
{
XElement nameElement=listNode.Element(“名称”);
if(namelement==null)
继续;
XElement childrenElement=listNode.Element(“子元素”);
if(childrenElement==null)
继续;
if(!childrenElement.HasElements)
结果.Add(namelement.Value);
其他的
填充名(childrenElement、result);
}
}
静态void Main(字符串[]参数)
{
var result=新列表();
string xml=Resources.xml;//TODO:将xml放在这里
XDocument doc=XDocument.Parse(xml);
如果(doc.Root==null)
返回;
XElement[]projects=doc.Root.Elements(“ProjectList”).ToArray();
foreach(项目中的XElement项目)
填充名称(项目、结果);
}
可以使用其他类似Linq2XML
?@SkyFang绝对可能为您提供很多帮助。为什么第一行抛出XmlException(第1行位置1中的无效数据),而这一行没有:XmlTextReader=new XmlTextReader(“MyXmlString”)代码>?我的第一行是这样的:
@user3596113在双引号前面使用\`
作为
如果您想使用硬编码的XML字符串,那么在双引号前面使用反斜杠作为
,否则如果您是从服务器获得的,则无需使用\`
,谢谢。到目前为止,它还在工作,但结果是空的,这意味着您使用的是问题中给出的相同XML吗?谢谢,但是eles
对我来说是空的。是的,您应该使用root.Element(xxx).Element(yyyy.Elements(“ProjectList”)
,因为我不知道您的树结构。您能否以正确的值显示xmlns
,这非常重要
var xDocument = XDocument.Parse("yourXmlString");
XNamespace ns = xDocument.Root.GetDefaultNamespace();
var result = (from e in xDocument
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode").Descendants(ns + "Children")
.Descendants(ns + "ListNode")
select e.Element(ns + "Name").Value).ToList();
static void GetMostInnerName()
{
string xml = @"<ProjectConfiguration xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xsi=""http://www.w3.org/2001/XMLSchema-instance"">
<ProjectLists>
<ProjectList>
<ListNode>
<Name>Test_Environment</Name>
<Children>
<ListNode>
<Name>yyy</Name>
<Children>
<ListNode>
<Name>205 (ST)</Name>
<Children>
<ListNode>
<Name>098-0031</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0032</Name>
<Children />
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>old</Name>
<Children>
<ListNode>
<Name>W098-32</Name>
<Children />
</ListNode>
</Children>
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>xxx</Name>
<Children>
<ListNode>
<Name>098-0001</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0011</Name>
<Children />
</ListNode>
</Children>
</ListNode>
// more List Nodes
</Children>
</ListNode>
</ProjectList></ProjectLists>
</ProjectConfiguration>";
XElement root = XElement.Parse(xml).Element("ProjectLists");
//var xmlns = root.GetDefaultNamespace();
//Console.WriteLine(xmlns);
var eles = root.Elements("ProjectList").SelectMany(x => x.Elements("ListNode"));
List<string> list = new List<string>();
foreach (var ele in eles)
{
Loop(ele, list);
}
list.ForEach(x =>
{
Console.WriteLine(x);
});
}
static void Loop(XElement ele, List<string> list)
{
var child = ele.Element("Children");
if (child != null && child.HasElements)
{
foreach (var e in child.Elements("ListNode"))
{
Loop(e, list);
}
}
else
{
list.Add(ele.Element("Name").Value);
}
}
098-0031
098-0032
W098-32
098-0001
098-0011
private static void FillNames(XElement container, List<string> result)
{
XElement[] listNodes = container.Elements("ListNode").ToArray();
if (!listNodes.Any())
return;
foreach (XElement listNode in listNodes)
{
XElement nameElement = listNode.Element("Name");
if (nameElement == null)
continue;
XElement childrenElement = listNode.Element("Children");
if (childrenElement == null)
continue;
if (!childrenElement.HasElements)
result.Add(nameElement.Value);
else
FillNames(childrenElement, result);
}
}
static void Main(string[] args)
{
var result = new List<string>();
string xml = Resources.Xml; // TODO: put your xml here
XDocument doc = XDocument.Parse(xml);
if (doc.Root == null)
return;
XElement[] projects = doc.Root.Elements("ProjectList").ToArray();
foreach (XElement project in projects)
FillNames(project, result);
}