如何从 XML 文件中查找和删除一段代码
How find and remove a piece of code from a XML file
xml:
<?xml version="1.0" encoding="UTF-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" (...) >
<w:body>
<w:tbl>
(...)
</w:tbl>
<w:sdt>
(...)
</w:sdt>
vvvvvvvv
<w:p w14:paraId="7A11D" w14:textId="7777777" w:rsidR="003B12D0" w:rsidRDefault="003B12D0" w:rsidP="003B12D0">
<w:pPr>
<w:rPr>
<w:sz w:val="18" />
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:sz w:val="18" />
</w:rPr>
<w:br w:type="page" />
</w:r>
<w:r>
<w:t />
</w:r>
</w:p>
^^^^^^
<w:sectPr w:rsidR="0094346E" w:rsidRPr="000947D4" w:rsidSect="009B7919">
(...)
</w:sectPr>
</w:body>
</w:document>
c#:
XDocument doc = outputDocument.Document;
XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");
var result = doc.Descendants().Select(x => x.Element(nameSpace + "p"));
此代码returns 包含
标签的所有元素。
如果我能找到一个带有标签的元素,那就太好了:
<w:r>
<w:t />
</w:r>
并删除父级最近的整个对象。
上面的代码在vvv和^^^
之间
XDocument doc = XDocument.Load(filename);
XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");
var nodesWithTagP = doc.Descendants().Select(x => x.Element(nameSpace + "p")).Where(x => x!=null);
foreach(var nodeWithTagP in nodesWithTagP)
{
var nodesWithTagR = nodeWithTagP.Descendants(nameSpace + "r");
foreach (var nodeWithTagR in nodesWithTagR)
{
var nodesWithTagT = nodeWithTagR.Descendants(nameSpace + "t");
foreach (var nodeWithTagT in nodesWithTagT)
{
if(nodeWithTagT.Descendants().Count() = 0)
{
//Here you can use nodeWithTagP
nodeWithTagP.Remove();
}
}
}
}
doc.Save(filename);
xml:
<?xml version="1.0" encoding="UTF-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" (...) >
<w:body>
<w:tbl>
(...)
</w:tbl>
<w:sdt>
(...)
</w:sdt>
vvvvvvvv
<w:p w14:paraId="7A11D" w14:textId="7777777" w:rsidR="003B12D0" w:rsidRDefault="003B12D0" w:rsidP="003B12D0">
<w:pPr>
<w:rPr>
<w:sz w:val="18" />
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:sz w:val="18" />
</w:rPr>
<w:br w:type="page" />
</w:r>
<w:r>
<w:t />
</w:r>
</w:p>
^^^^^^
<w:sectPr w:rsidR="0094346E" w:rsidRPr="000947D4" w:rsidSect="009B7919">
(...)
</w:sectPr>
</w:body>
</w:document>
c#:
XDocument doc = outputDocument.Document;
XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");
var result = doc.Descendants().Select(x => x.Element(nameSpace + "p"));
此代码returns 包含
标签的所有元素。 如果我能找到一个带有标签的元素,那就太好了:
<w:r>
<w:t />
</w:r>
并删除父级最近的整个对象。 上面的代码在vvv和^^^
之间 XDocument doc = XDocument.Load(filename);
XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");
var nodesWithTagP = doc.Descendants().Select(x => x.Element(nameSpace + "p")).Where(x => x!=null);
foreach(var nodeWithTagP in nodesWithTagP)
{
var nodesWithTagR = nodeWithTagP.Descendants(nameSpace + "r");
foreach (var nodeWithTagR in nodesWithTagR)
{
var nodesWithTagT = nodeWithTagR.Descendants(nameSpace + "t");
foreach (var nodeWithTagT in nodesWithTagT)
{
if(nodeWithTagT.Descendants().Count() = 0)
{
//Here you can use nodeWithTagP
nodeWithTagP.Remove();
}
}
}
}
doc.Save(filename);