我正在开展一个项目,要求我处理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
答案 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声明。