读取xml文档并更新所有字段c#

时间:2015-11-19 12:09:15

标签: c# .net xml

我试图阅读xml文件并更新它的xml值

<adf>
    <prospect>
        <requestdate>2015-10-29 07-38-22</requestdate>
        <id sequence="1" source="admin.ss.com">admin.ss.com</id>
        <vehicle interest="buy" status="">
            <id sequence="1" source=""></id>
            <year></year>
            <make></make>
            <model>camry</model>
            <vin></vin>
            <stock></stock>
            <trim></trim>
        </vehicle>
        <customer>
            <contact primarycontact="1">
                <name part="first">Jessica</name>
                <name part="last">Sonntag</name>
                <email>js@test.com</email>
                <phone type="phone" time="day">555-585-5555</phone>
                <address>
                    <street line="1"></street>
                    <city></city>
                    <regioncode></regioncode>
                    <postalcode></postalcode>
                    <country></country>
                </address>
            </contact>
            <comments>Vehicle Year: 2011 Comments: </comments>
        </customer>
        <provider>
            <name part="full">ST</name>
            <service> Engine Marketing</service>
            <phone>1-866-572-3952</phone>
        </provider>
    </prospect>
</adf>

所以我选择如下节点

 var items = (from item in xmlDoc.Descendants("requestdate")
                         select item).ToList();

然后我只能更新requestdata标签值,所以我必须为所有标签重复相同,或者有任何好方法来实现这一点。

此致

4 个答案:

答案 0 :(得分:2)

有一种简单的方法可以做到这一点。这是一个隐藏的宝石。大多数人可能不知道这一点。这个功能来自VS2013,它被称为&#34;将XML粘贴为类。&#34;

  1. 保存xml(例如:MyXml.XML)
  2. 创建新的控制台项目
  3. 在Visual Studio中打开Xml
  4. 复制xml的所有内容(Ctl + A,Ctl + C)
  5. 向项目添加新课程。你可以给出任何你喜欢的名字。
  6. 转到编辑&gt;选择性粘贴&gt;将XML粘贴为类。
  7. 在项目中添加另一个类。然后在下面添加两个方法。

      public static string Serialise<T>(T serialisableObject)
      {
        var doc = new XmlDocument();
        using (var stream = new StringWriter())
        {
            var settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
    
            XmlWriter xmlWriter = XmlWriter.Create(stream, settings);
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
    
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(xmlWriter, serialisableObject, ns);
            doc.LoadXml(stream.ToString());
        }
        return doc.InnerXml;
    }
    
    public static T Deserialise<T>(string xml)
    {
        T list;
        using (var reader = new StringReader(xml))
        {
            var serialiser = new XmlSerializer(typeof(T));
            list = (T)serialiser.Deserialize(reader);
        }
        return list;
    }
    
  8. 然后在你的控制台应用程序中使用Main方法;加上这个。

                var myObj = new adf();
                myObj.prospect =  new adfProspect();
                myObj.prospect.customer =  new adfProspectCustomer(){comments = "dgsrtetetete"};
                //populate all fields.....
    
                var xml = MySerializer.Serialise(myObj);
                File.WriteAllText(@"C:\myNewXml.xml", xml);
    

    那就是它。现在,您可以将xml对象反序列化到类中。

答案 1 :(得分:1)

尝试使用XmlSerializer类:https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer(v=vs.110).aspx如果序列化/反序列化xml,那么向上约会是微不足道的。

答案 2 :(得分:1)

如果您想将每个电话号码更改为“0123456789”,您可以执行以下操作:

var xDoc = XDocument.Load("document.xml");

var results = from phone in xDoc.Descendants("phone") select phone;

foreach (XElement result in results)
{
    element.SetValue("0123456789");
}

答案 3 :(得分:1)

我已经提出了支持两种扩展方法的解决方案我正在迭代所有节点并更新。(因为我的xml不是太大或太复杂,这将是一个很好的解决方案) 借助这两种扩展方法

public static void IterateThroughAllNodes(this XmlDocument doc, Action<XmlNode> elementVisitor)
{
    if (doc != null && elementVisitor != null)
    {
        foreach (XmlNode node in doc.ChildNodes)
        {
            DoIterateNode(node, elementVisitor);
        }
    }
}

public static void IterateThrough(this XmlNodeList nodes, Action<XmlNode> elementVisitor)
{
    if (nodes != null && elementVisitor != null)
    {
        foreach (XmlNode node in nodes)
        {
            DoIterateNode(node, elementVisitor);
        }
    }
}

private static void DoIterateNode(XmlNode node, Action<XmlNode> elementVisitor)
{
    elementVisitor(node);
    foreach (XmlNode childNode in node.ChildNodes)
    {
        DoIterateNode(childNode, elementVisitor);
    }
}

然后我可以更新我的xml节点,如下所示

XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/xmlmail.xml"));
var email = new XmlEmail();
doc.IterateThroughAllNodes(
    delegate(XmlNode node)
    {
        if (node.Name.Equals("requestdate"))
            node.InnerText= email.RequestDate.ToLongDateString();
        if (node.Name.Equals("vehicle"))
        {
            XmlNodeList childs = node.ChildNodes;
            childs.IterateThrough(delegate(XmlNode vnode)
            {
                if (vnode.Name.Equals("id"))
                    vnode.InnerText= email.VehicleId.ToString();
                if (vnode.Name.Equals("year"))
                    vnode.InnerText= email.Year.ToString();
                if (vnode.Name.Equals("make"))
                    vnode.InnerText= email.Make;
                if (vnode.Name.Equals("model"))
                    vnode.InnerText= email.Model;
                if (vnode.Name.Equals("vin"))
                    vnode.InnerText= email.Vin;
                if (vnode.Name.Equals("trim"))
                    vnode.InnerText = email.Trim;
            });
        }
        if (node.Name.Equals("customer"))
        {
            XmlNodeList childs = node.ChildNodes;
            childs.IterateThrough(delegate(XmlNode vnode)
            {
                if (vnode.Attributes != null && (vnode.Name.Equals("name") && vnode.Attributes["part"].Value.Equals("first")))
                    vnode.InnerText= email.FirstName;
                if (vnode.Attributes != null && (vnode.Name.Equals("name") && vnode.Attributes["part"].Value.Equals("last")))
                    vnode.InnerText= email.LastName;
                if (vnode.Name.Equals("email"))
                    vnode.InnerText= email.Email;
                if (vnode.Name.Equals("phone"))
                    vnode.InnerText= email.Phone;
                if (vnode.Name.Equals("comments"))
                    vnode.InnerText= email.Comments;
                if (vnode.Name.Equals("address"))
                {
                    XmlNodeList addresschilds = vnode.ChildNodes;
                    addresschilds.IterateThrough(delegate(XmlNode anode)
                    {
                        if (anode.Name.Equals("street"))
                            anode.InnerText= email.Street;
                        if (anode.Name.Equals("city"))
                            anode.InnerText= email.City;
                        if (anode.Name.Equals("phone"))
                            anode.InnerText= email.Phone;
                        if (anode.Name.Equals("regioncode"))
                            anode.InnerText= email.RegionCode;
                        if (anode.Name.Equals("postalcode"))
                            anode.InnerText= email.Postalode;
                        if (anode.Name.Equals("country"))
                            anode.InnerText= email.Country;
                    });
                }
            });
        }
    });