【问题标题】:How to remove #text from xml file using c#如何使用c#从xml文件中删除#text
【发布时间】:2016-10-07 05:40:31
【问题描述】:

我正在尝试读取 xml 文件,并且在读取时我将 #text 作为值。我已经删除了所有空格,然后这个#text也不断出现。解决方案是什么?

这是我原来的xml文件

<book genre='novel' ISBN='1-861003-78' misc='sale-item'>
  <title>The Handmaid's Tale</title>
  <price>14.95</price>
</book>

这是我删除空格后的新 xml 文件

<!--sample XML fragment--><book genre='novel' ISBN='1-861003-78' misc='sale-item'><title>The Handmaid's Tale</title><price>14.95</price></book>

我正在尝试验证两个 xml 文件,这是代码

 static bool structValidate( XmlNodeList xmlOldNode, XmlNodeList xmlNewNode)
    {

        if (xmlOldNode.Count != xmlNewNode.Count) return true;

        for (var i = 0; i < xmlOldNode.Count; i++)
        {
            var nodeA = xmlOldNode[i];
            var nodeB = xmlNewNode[i];
            Console.WriteLine("\n" + nodeA.Name + ":");
            Console.WriteLine("\n" + nodeB.Name + ":");
            Console.ReadLine();

                if (nodeA.Attributes == null  )
                {
                    if (nodeB.Attributes != null)
                        return true;
                    else
                        continue;
                }


            if (nodeA.Attributes.Count != nodeB.Attributes.Count
            || nodeA.Name != nodeB.Name) return true;


            for (var j = 0; j < nodeA.Attributes.Count; j++)
            {
                var attrA = nodeA.Attributes[j];
                var attrB = nodeB.Attributes[j];
                Console.WriteLine(attrA.Name);
                Console.WriteLine(attrB.Name);
                Console.ReadLine();
                if (attrA.Name != attrB.Name) return true;
            }

            if (nodeA.HasChildNodes && nodeB.HasChildNodes)
            {
                return structValidate(nodeA.ChildNodes, nodeB.ChildNodes);

            }               
            else 
            {
                return false;
            }
        }
       return false;
    }

所以在打印时我得到#text

【问题讨论】:

  • 您的具体要求是什么?您想存储没有空格的 XML 吗?还是想做一些其他的操作?
  • 我的具体操作是比较两个xml文件的结构。例如 没有孩子,所以下一次迭代应该是 <price>。但是下一次迭代是 #text</price>
  • 为什么不创建 XML 模式并使用模式验证 XML?

标签: c# xml xml-parsing


【解决方案1】:

#text 节点是旧 XML 文件的解析器返回的空白 - &lt;title&gt;&lt;price&gt; 节点之前的缩进。

错误在于您加载旧 XML 文件的方式。它将空格解析为 XML 节点。

您的 XML 解析方式会将这 2 个 XML 文件视为相同的文件:

<book genre='novel' ISBN='1-861003-78' misc='sale-item'>
  <title>The Handmaid's Tale</title>
  <price>14.95</price>
</book>

<book genre='novel' ISBN='1-861003-78' misc='sale-item'>
someUnformatedText<title>The Handmaid's Tale</title>
someUnformatedText<price>14.95</price>
</book>

这是XmlNode.Name的文档

节点的限定名称。返回的名称取决于 节点的NodeType:

文本 -> #text

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-30
    相关资源
    最近更新 更多