非常感谢您阅读我的问题。
底部是我的xml文件的示例。请参考。
我以前做过一些xml文件,但是用“CMarkXml”。 “IntoElement,OutofElement”非常清楚。但是当C#...我迷路了..
1:如何阅读&在不使用标签名称的情况下编写我的xml文件。我看到一些关于c#对xml文件的操作的文章,但是所有人都认为已知标签名称。
2:如果没有标签名称,则很难或不推荐。然后如何阅读&通过XmlDocument写我的xml文件? (对不起,但请不要凌,我很晕......)。
3:我的想法是,对于xml文件,拿出一些部分,我们仍然可以通过xmldocument解析该部分。
4:对于写/修改xml文件,当然应该包含删除一些部分,删除一些“叶子”,更改属性...
非常感谢您阅读长篇问题,以及任何帮助,我将非常感谢。如果您有一个很好的示例代码但没有大陆粘贴它们,您可以将它发送到“erlvde@gmail.com”吗?
<root>
<a>i belong to a</a>
<b>
<bb>
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
</bb>
<bb>
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
<bb>
....(other <bb>)
</b>
</root>
答案 0 :(得分:2)
将您的xml读入XmlDocument
:
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("XML HERE");
访问子节点:
xmlDocument.ChildNodes[1]
但它也很容易出错
您还可以检查是否有子节点:
xmlDocument.HasChildNodes
获取子节点数:
xmlDocument.ChildNodes.Count
答案 1 :(得分:1)
在我看来,您的元素名称包含标识符。如果是这种情况,并且您可以控制XML模式,我强烈建议您更改XML以包含指示标识符的元素和/或属性,然后使用内置的XmlSerializer类来进行XML序列化。它有许多可用的修饰符,例如XmlElement和XmlAttribute等格式化输出。
Here是一个帮助您入门的教程。
如果可能的话,将XML更改为类似下面的内容,这样可以更容易操作...如果有可能更改架构。
<root>
<a>i belong to a</a>
<b>
<bb id="1">
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
</bb>
<bb id="2">
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
<bb>
</b>
</root>
修改 此修改会反映您对XML所做的更改
这是一个简单的控制台应用程序,它将对象序列化为XML文件,然后重新水化。
预期XML
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<a>i belong to a</a>
<b>
<bb>
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
</bb>
<bb>
<bb>1</bb>
<bb>2</bb>
<bb>3</bb>
<bb>4</bb>
<bb>5</bb>
</bb>
</b>
</root>
简单控制台应用程序演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var items = new root
{
a = "i belong to a",
b = new List<bb>
{
new bb
{
bbClassProperty = new List<int>
{
1,
2,
3,
4,
5
}
},
new bb
{
bbClassProperty= new List<int>
{
1,
2,
3,
4,
5
}
}
}
};
XmlSerializer serializer = new XmlSerializer(typeof(root));
using (var textWriter = new StreamWriter(@"C:\root.xml"))
{
serializer.Serialize(textWriter, items);
textWriter.Close();
}
using (var stream = new StreamReader(@"C:\root.xml"))
{
var yourObject = serializer.Deserialize(stream);
}
Console.Read();
}
}
#region [Classes]
public class root
{
public string a { get; set; }
public List<bb> b { get; set; }
}
public class bb
{
[XmlElement("bb")]
public List<int> bbClassProperty { get; set; }
}
#endregion
}
答案 2 :(得分:0)
查看ChildNodes
对象上的XmlElement
(和类似)属性和方法。这些将允许您遍历节点的子节点,然后您可以询问该节点的名称。
答案 3 :(得分:0)
如果你有一个XmlNode对象,你可以使用XMLNode.FirstChild来获取孩子,如果有的话。您还可以使用XMLNode.NextSibling来获取同一父节点的下一个节点。 为什么不能使用节点的名称?这是最简单,最常见的方式。特别是如果你使用XPath或类似的。
XPath也是你第二个问题的答案。
答案 4 :(得分:0)
你可以使用类XML阅读器,给出一个简单的例子here。
using System;
using System.Xml;
class Program
{
static void Main()
{
// Create an XML reader for this file.
using (XmlReader reader = XmlReader.Create("perls.xml"))
{
while (reader.Read())
{
// Only detect start elements.
if (reader.IsStartElement())
{
// Get element name and switch on it.
switch (reader.Name)
{
case "perls":
// Detect this element.
Console.WriteLine("Start <perls> element.");
break;
case "article":
// Detect this article element.
Console.WriteLine("Start <article> element.");
// Search for the attribute name on this current node.
string attribute = reader["name"];
if (attribute != null)
{
Console.WriteLine(" Has attribute name: " + attribute);
}
// Next read will contain text.
if (reader.Read())
{
Console.WriteLine(" Text node: " + reader.Value.Trim());
}
break;
}
}
}
}
}
}
输入文件文本为:
<?xml version="1.0" encoding="utf-8" ?>
<perls>
<article name="backgroundworker">
Example text.
</article>
<article name="threadpool">
More text.
</article>
<article></article>
<article>Final text.</article>
</perls>
输出
启动元素。
启动元素。
具有属性名称:backgroundworker
文本节点:示例文本。
启动元素。
具有属性名称:threadpool
文字节点:更多文字。
启动元素。
文字节点:
启动元素。
文字节点:最终文字。
enter code here
如果上面的示例中文件不包含标题,则可以使用以下代码。
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
reader = XmlReader.Create(filePath, settings)
答案 5 :(得分:0)
这样的事情有帮助吗?
void Iterate(XmlNode parent) {
//do something with
//parent.Name
//parent.Value
//parent.Attributes
foreach(XmlNode child in parent.ChildNodes) {
Iterate(child);
}
}
XmlDocument document = new XmlDocument();
document.Load(filename);
XmlNode parent = document.DocumentElement;
Iterate(parent);
你也可以像那样存储它(抱歉任何语法错误,没有运行它)
public class Document {
public Element DocumentElement { set; get; }
private void Load(string fileName) {
XmlDocument document = new XmlDocument();
document.Load(fileName);
DocumentElement = new Element(this, null);
DocumentElement.Load(document.DocumentElement);
}
}
public class Element {
public string Name { set; get; }
public string Value { set; get; }
//other attributes
private Document document = null;
private Element parent = null;
public Element Parent { get { return parent; } }
public List<Element> Children { set; get; }
private int order = 0;
public Element(Document document, Element parent) {
Name = "";
Value = "";
Children = new List<LayoutElement>();
this.document = document;
this.parent = parent;
order = parent != null ? parent.Children.Count + 1 : 1;
}
private Element GetSibling(bool left) {
if(parent == null) return null;
int add = left ? -1 : +1;
Element sibling = parent.Children.Find(child => child.order == order + add);
return sibling;
}
public Element GetLeftSibling() {
return GetSibling(true);
}
public Element GetRightSibling() {
return GetSibling(false);
}
public void Load(XmlNode node) {
Name = node.Name;
Value = node.Value;
//other attributes
foreach(XmlNode nodeChild in node.Children) {
Element child = new Element(document, this);
child.Load(nodeChild);
Children.Add(child);
}
}
}
Document document = new Document();
document.Load(fileName);
现在更改/删除您可以迭代树并按名称查找元素,但由于名称不是唯一的,因此您将同时影响许多元素。您可以在每个标记中添加唯一ID,例如
<bb id="bb1"/>
然后在Load函数中读取它,如
id = ((XmlElement)node).GetAttribute("id");
并使用此id迭代树。对不起,我现在没时间提供更详细的信息。