使用Xdocument类处理Xhtml文件会添加不需要的元素

时间:2014-09-12 16:24:19

标签: c# xhtml linq-to-xml

我正在开展一个项目,要求我处理xhtml文件以修复某些标签的内容。修复本身不是问题,但是在保存文件时我遇到了麻烦。

我使用的代码是:

 var spanNodesList = p.GetSpanNodesList(xDoc);

            foreach (XElement span in spanNodesList)
            {
                if (span.Value == null || span.Value == "")
                {
                    span.Remove();
                }
                else
                {
                    string[] words = p.SplitNodeText(span.Value);
                    XElement parent = span.Parent;
                    span.Remove();

                    foreach (string word in words)
                    {
                        parent.Add(new XElement("span", word,
                            new XAttribute("id", "w" + p.currentNodeID.ToString())));
                        p.currentNodeID++;
                    }                      
                }
            }

List<XElement> GetSpanNodesList(XDocument file)
    {
        //Get only 'word' nodes
        var spanNodes = file.Descendants("{http://www.w3.org/1999/xhtml}span");
        if (spanNodes != null)
        {
            var spanNodesList = spanNodes.ToList();
            spanNodesList.RemoveAll(x => ((x.Attribute("id") == null) || !x.Attribute("id").Value.Contains("w")));
            return spanNodesList;
        }
        else return null;
    }

首先,我无法得到任何元素,我在SO中发现某些地方我可能需要将命名空间引用添加到file.Descendants("{http://www.w3.org/1999/xhtml}span");,因为它没有产生任何结果。这确实有帮助,我得到了我想要的节点。但是,生成的代码产生了两个问题。

        <span id="w1" xmlns="">Word one</span>
        <span id="w2" xmlns="">Word two</span>
        <span id="w3" xmlns="">Word three</span>

它添加了我不需要的xmlns属性(并且它不在原始文件中)并添加了<?xml version="1.0" encoding="utf-8"?>标头。我认为这是我编码的预期行为,所以我的问题是 - 我该怎么做才能消除这些'问题'。或许有更好的方法来处理xHtml文件?另外,我不知道这是否相关,但源文件引用了许多不同的命名空间......

干杯 的Bartosz

1 个答案:

答案 0 :(得分:0)

当您添加span元素时,您没有使用命名空间 - 而某些祖先元素已设置默认命名空间。您需要做的就是为新元素使用正确的命名空间:

XNamespace ns = "http://www.w3.org/1999/xhtml";
...
parent.Add(new XElement(ns + "span", ...);

同样,您可以使用:

var spanNodes = file.Descendants(ns + "span");
IMO,

更具可读性。您几乎肯定不必担心XML声明。