使用linq将基于其Parent标记的Attribute添加到xml



我有一个问题,我需要根据元素的父元素向元素添加属性

这是我的输入:

<p>
    <InlineEquation ID="IEq4">
        <math xmlns:xlink="http://www.w3.org/1999/xlink">
            <mi>n</mi>
            <mo>!</mo>
        </math>
    </InlineEquation>
    <MoreTag>
        <Equation ID="Equ1">
            <math xmlns:xlink="http://www.w3.org/1999/xlink">
                <mi>n</mi>
                <mo>!</mo>
            </math>
        </Equation>
    </MoreTag>
</p>

这是我的输出

<p>
    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <mi>n</mi>
        <mo>!</mo>
    </math>
    <MoreTag>
        <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">
            <mi>n</mi>
            <mo>!</mo>
        </math>
    </MoreTag>
</p>

如果父标签名称为InlineEquation,则其标签名称和属性将更改为<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">

如果父标签名称为Equation,则其标签名称和属性将更改为<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">

这是我的代码

XElement rootEquation = XElement.load("myfile.xml")
IEnumerable<XElement> equationFormat =
    from el in rootEquation.Descendants("InlineEquation ").ToList()
    select el;
foreach (XElement el in equationFormat)
{
    Console.WriteLine(el);
    //what code do i need here?
}

这里需要做四件事:

  • 删除未使用的命名空间声明xmlns:xlink="..."
  • 添加显示属性
  • 重命名父元素及其子元素以包含新的命名空间
  • 删除父元素并替换为其子元素

因此,以InlineEquation为例:

XNamespace mathMl = "http://www.w3.org/1998/Math/MathML";
var doc = XDocument.Parse(xml);
foreach (var equation in doc.Descendants("InlineEquation").ToList())
{
    foreach (var math in equation.Elements("math"))
    {
        math.Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
        math.SetAttributeValue("display", "block");
        foreach (var element in math.DescendantsAndSelf())
        {
            element.Name = mathMl + element.Name.LocalName;
        }               
    }
    equation.ReplaceWith(equation.Nodes());            
}

看看这个小提琴的工作演示。我将把Equation和消除重复的重构留给您。

您可以直接在数学节点上工作,并检查它们的父级

XNamespace newNs= "http://www.w3.org/1998/Math/MathML";
var xDoc = XDocument.Load(<yourxml>);
var maths = xDoc.Descendants("math").ToList();
foreach (var math in maths){
    //remove old namespace (well, all attributes with this code)
    math.RemoveAttributes();
    //change the namespace
    foreach (var m in math .DescendantsAndSelf())
          m.Name = newNs + m.Name.LocalName;
    //add the display attribute depending on parent
    if (math.Parent.Name == "InlineEquation")
        math.SetAttributeValue("display", "block");
    if (math.Parent.Name == "Equation")
        math.SetAttributeValue("display", "inline");
    //replace parent node by math node
    math.Parent.ReplaceWith(newNode);
}

相关内容

  • 没有找到相关文章

最新更新