XML 解析 - 解析 2 个相同名称的 XML 数组
XML Parsing - Parsing 2 identical named XMLArrays
我实际上已经搜索了周围,但没有找到满足我要求的解决方案。我要做的是将.csproj文件的一些信息解析成c#对象。
我正在使用此功能来执行此操作。该方法提供了解析任何 xmlFile 的可能性,只要我将文件表示为 c# 对象即可进行转换。
public static Object DeserializeXml(string xmlPath)
{
if (File.Exists(xmlPath))
{
object returnObject;
XmlSerializer serializer = new XmlSerializer(typeof (ProjectConfiguration));
using (FileStream fs = new FileStream(xmlPath, FileMode.Open))
{
XmlReader reader = XmlReader.Create(fs);
returnObject = serializer.Deserialize(reader);
fs.Close();
}
return returnObject;
}
return null;
}
问题来了。 csproj 文件显示类似的 XmlArrays。
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>enter code here
有人知道如何在 c# class 文件中对其进行注释吗?
这会引发错误...
[XmlArray("ItemGroup")]
[XmlArrayItem("Compile")]
[XmlAttribute("Include")]
public List<string> ItemGroupCompileIncludeSurrogate
{
get {...}
set {...}
}
[XmlArray("ItemGroup")]
[XmlArrayItem("Reference ")]
[XmlAttribute("Include")]
public List<string> ItemGroupCompileIncludeSurrogate
{
get {...}
set {...}
}
谢谢大家的预测! ;-)
[编辑]
使用第一个想法后 -> 谢谢 :-) 它看起来像这样
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
Greez Iki
尝试:
public class Root
{
[XmlElement("ItemGroup")]
public List<ItemGroup> ItemGroups { get; set; }
}
public class ItemGroup
{
[XmlElement("Reference")]
public List<ReferenceOrCompile> References { get; set; }
[XmlElement("Compile")]
public List<ReferenceOrCompile> Compiles { get; set; }
}
public class ReferenceOrCompile
{
[XmlAttribute("Include")]
public string Include { get; set; }
}
如果要将对象转换为 xml,请使用:
var item1 = new ReferenceOrCompile() { Include = "System" };
var item2 = new ReferenceOrCompile() { Include = "System.Core" };
var item3 = new ReferenceOrCompile() { Include = "Class1.cs" };
var item4 = new ReferenceOrCompile() { Include = "Properties\AssemblyInfo.cs" };
var group1 = new ItemGroup()
{
References = new List<ReferenceOrCompile>()
{
item1, item2
}
};
var group2 = new ItemGroup()
{
Compiles = new List<ReferenceOrCompile>()
{
item3, item4
}
};
var root = new Root()
{
ItemGroups = new List<ItemGroup>()
{
group1, group2
}
}
然后序列化(root)
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
Root root = new Root()
{
itemGroup = new List<ItemGroup>() {
new ItemGroup(){
reference = new List<Reference>() {
new Reference(){ include = "System"},
new Reference(){ include= "System.Core"}
}
},
new ItemGroup(){
compile = new List<Compile>(){
new Compile() { include = "Class1.cs"},
new Compile() { include = "Properties\AssemblyInfo.cs"}
}
}
}
};
XmlSerializer serializer = new XmlSerializer(typeof(Root));
StreamWriter writer = new StreamWriter(FILENAME);
serializer.Serialize(writer, root);
writer.Flush();
writer.Close();
writer.Dispose();
XmlSerializer xs = new XmlSerializer(typeof(Root));
XmlTextReader reader = new XmlTextReader(FILENAME);
Root newRoot = (Root)xs.Deserialize(reader);
}
}
[XmlRoot("Root")]
public class Root
{
[XmlElement("ItemGroup")]
public List<ItemGroup> itemGroup { get; set; }
}
[XmlRoot("ItemGroup")]
public class ItemGroup
{
[XmlElement("Compile")]
public List<Compile> compile { get; set; }
[XmlElement("Reference")]
public List<Reference> reference { get; set; }
}
[XmlRoot("Compile")]
public class Compile
{
[XmlAttribute("Include")]
public string include { get; set; }
}
[XmlRoot("Reference")]
public class Reference
{
[XmlAttribute("Include")]
public string include { get; set; }
}
}
我实际上已经搜索了周围,但没有找到满足我要求的解决方案。我要做的是将.csproj文件的一些信息解析成c#对象。
我正在使用此功能来执行此操作。该方法提供了解析任何 xmlFile 的可能性,只要我将文件表示为 c# 对象即可进行转换。
public static Object DeserializeXml(string xmlPath)
{
if (File.Exists(xmlPath))
{
object returnObject;
XmlSerializer serializer = new XmlSerializer(typeof (ProjectConfiguration));
using (FileStream fs = new FileStream(xmlPath, FileMode.Open))
{
XmlReader reader = XmlReader.Create(fs);
returnObject = serializer.Deserialize(reader);
fs.Close();
}
return returnObject;
}
return null;
}
问题来了。 csproj 文件显示类似的 XmlArrays。
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>enter code here
有人知道如何在 c# class 文件中对其进行注释吗? 这会引发错误...
[XmlArray("ItemGroup")]
[XmlArrayItem("Compile")]
[XmlAttribute("Include")]
public List<string> ItemGroupCompileIncludeSurrogate
{
get {...}
set {...}
}
[XmlArray("ItemGroup")]
[XmlArrayItem("Reference ")]
[XmlAttribute("Include")]
public List<string> ItemGroupCompileIncludeSurrogate
{
get {...}
set {...}
}
谢谢大家的预测! ;-)
[编辑] 使用第一个想法后 -> 谢谢 :-) 它看起来像这样
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
Greez Iki
尝试:
public class Root
{
[XmlElement("ItemGroup")]
public List<ItemGroup> ItemGroups { get; set; }
}
public class ItemGroup
{
[XmlElement("Reference")]
public List<ReferenceOrCompile> References { get; set; }
[XmlElement("Compile")]
public List<ReferenceOrCompile> Compiles { get; set; }
}
public class ReferenceOrCompile
{
[XmlAttribute("Include")]
public string Include { get; set; }
}
如果要将对象转换为 xml,请使用:
var item1 = new ReferenceOrCompile() { Include = "System" };
var item2 = new ReferenceOrCompile() { Include = "System.Core" };
var item3 = new ReferenceOrCompile() { Include = "Class1.cs" };
var item4 = new ReferenceOrCompile() { Include = "Properties\AssemblyInfo.cs" };
var group1 = new ItemGroup()
{
References = new List<ReferenceOrCompile>()
{
item1, item2
}
};
var group2 = new ItemGroup()
{
Compiles = new List<ReferenceOrCompile>()
{
item3, item4
}
};
var root = new Root()
{
ItemGroups = new List<ItemGroup>()
{
group1, group2
}
}
然后序列化(root)
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
Root root = new Root()
{
itemGroup = new List<ItemGroup>() {
new ItemGroup(){
reference = new List<Reference>() {
new Reference(){ include = "System"},
new Reference(){ include= "System.Core"}
}
},
new ItemGroup(){
compile = new List<Compile>(){
new Compile() { include = "Class1.cs"},
new Compile() { include = "Properties\AssemblyInfo.cs"}
}
}
}
};
XmlSerializer serializer = new XmlSerializer(typeof(Root));
StreamWriter writer = new StreamWriter(FILENAME);
serializer.Serialize(writer, root);
writer.Flush();
writer.Close();
writer.Dispose();
XmlSerializer xs = new XmlSerializer(typeof(Root));
XmlTextReader reader = new XmlTextReader(FILENAME);
Root newRoot = (Root)xs.Deserialize(reader);
}
}
[XmlRoot("Root")]
public class Root
{
[XmlElement("ItemGroup")]
public List<ItemGroup> itemGroup { get; set; }
}
[XmlRoot("ItemGroup")]
public class ItemGroup
{
[XmlElement("Compile")]
public List<Compile> compile { get; set; }
[XmlElement("Reference")]
public List<Reference> reference { get; set; }
}
[XmlRoot("Compile")]
public class Compile
{
[XmlAttribute("Include")]
public string include { get; set; }
}
[XmlRoot("Reference")]
public class Reference
{
[XmlAttribute("Include")]
public string include { get; set; }
}
}