【问题标题】:How to serialize a xml node with text value and other child nodes如何用文本值和其他子节点序列化 xml 节点
【发布时间】:2016-11-18 09:19:47
【问题描述】:

我有一个这样的 xml:

<xmlRootNode>
    <levelOneChildNode>
        Some text
        <levelTwoChildNode>
            <levelThreeChildNode>More text</levelThreeChildNode>
        </levelTwoChildNode>
    </levelOneChildNode>
</xmlRootNode>

我无法更改 xml 格式,因为我的客户想要这种格式。我应该如何创建和装饰“levelOneChildNode”类以进行正确的序列化?我不能使用 XmlElement 或 XmlAttribute。做到这一点的唯一方法比我想象的是将“一些文本”作为 XmlElement 并制作一个

string.replace("<textNode>", string.empty).replace("</textNode>", string.empty)

使用 de 序列化 xml 删除 de 标签,但这是一个糟糕的解决方案。

任何想法无需手动 xml 操作

【问题讨论】:

  • 你的客户错了。此 XML 无效。
  • @user1681317 除了levelTwoChildNode 的预期关闭标签中的错字之外,还有什么问题?
  • xml 元素不能包含文本值和子元素。
  • 不,我的错。它可以:)
  • @user1681317 事实上,这种奇怪的 xml 格式通过了 WC3 验证工具。我想和你一样,但我的客户不同意 XD

标签: c# .net xml-serialization


【解决方案1】:

我猜你有两个选择,它们都与手动 xml 操作有关:

  1. 使用 XmlWriter 一个一个地写元素。
  2. 填充通用 XmlDocument, 并保存。

【讨论】:

    【解决方案2】:

    设置/检索/追加/创建 XmlNotes(值):

    //file name
    string filename = @"d:\temp\XMLFile2.xml";
    
    //create new instance of XmlDocument
    XmlDocument _doc = new XmlDocument();
    
    //load from file
    _doc.Load(filename);
    
    // Change text in xml
    XmlNode node= _doc.SelectSingleNode("xmlRootNode/levelOneChildNode"); // [index of user node]
    node.InnerText = value;
    _doc.Save(@"path");
    
    // Retrive value from xml
    XmlNode node = _doc.SelectSingleNode("xmlRootNode/levelOneChildNode/levelTwoChildNode/someAttribute");
    string value = node.InnerText;
    
    // read or write to more elements
    foreach (XmlNode node in doc.SelectNodes("xmlRootNode/levelOneChildNode/levelTwoChildNode"))
    {
        string data= node.SelectSingleNode("someAttribute").InnerTex; // get value of someAttribute.
    
        node.InnerText = value;
    } 
    
    // Append Note to levelOneChildNode Note 
    
    // Create second node
    XmlNode secondNode = doc.CreateElement("SecondLevelNode");
    secondNode .InnerText = "This title is created by code"
    
    XmlNode firstNode= _doc.SelectSingleNode("xmlRootNode/levelOneChildNode");
    firstNode.AppendChild(secondNode );
    _doc.Save(@"path");
    

    【讨论】:

    • 序列化 xml 文档,然后进行手动 xml 操作是一种选择,但如果有一种方法可以在不编辑序列化 xml 的情况下执行此操作,那就更好了。
    • 但是,如果这是一个简单易用的解决方案,为什么要这样做呢?
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多