我有第三方组件生成序列化的xml和存储过程,它解析xml并将值插入表中。
我在组件和sql存储过程中处理xsi nil时遇到问题。我无法控制更改组件或存储过程。因此,属性解决方案上的IsNullable属性而不是程序解决方案中的xsi = true对我没有帮助。
我正在尝试使用正则表达式来处理这个问题。
.*xsi\:nil\=\"true\" \/\>
以上正则表达式匹配适用于以下输入
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
<prop11>abc</prop11>
<prop12 xsi:nil="true" />
<prop13>def</prop13>
</prop1>
</Root>
但不是这个输入
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><prop1><prop11>abc</prop11><prop12 xsi:nil="true" /><prop13>def</prop13></prop1></Root>
所需的输出
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
<prop11>abc</prop11>
<prop13>def</prop13>
</prop1>
</Root>
更新: 属性名称和级别仅在运行时已知。请参考下面的其他xml
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<pa>
<paa>abc</paa>
<pab xsi:nil="true" />
<pac>def</pac>
<pad>
<pada>val1</pada>
<padb xsi:nil="true" />
<padc>
<padca>vala</padca>
<padcb xsi:nil="true" />
</padc>
<pad>
</prop1>
</Root>
上述xml的所需输出是
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<pa>
<paa>abc</paa>
<pac>def</pac>
<pad>
<pada>val1</pada>
<padc>
<padca>vala</padca>
</padc>
<pad>
</prop1>
</Root>
有人可以帮助我吗
谢谢,
也先
答案 0 :(得分:4)
使用此库中的XPath:https://github.com/ChuckSavage/XmlLib/
我得到xsi:nil=true
的XElements:
XElement root = XElement.Load(file);
// or root = XElement.Parse(xml);
IEnumerable<XElement> result = root.XPath("//*[@xsi:nil={0}]", true);
result.ToList().ForEach(x => x.Remove());
root.Save(file);
// or xml = root.ToString();
我用这个XML测试了它:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
<prop10 xsi:nil="true" />
<prop11>abc</prop11>
<prop12 xsi:nil="true" />
<prop13>def</prop13>
<prop14 xsi:nil="true" />
<prop15>def</prop15>
<prop16 xsi:nil="true" />
</prop1>
</Root>
找到所有4个XElements。从那里他们被删除。
生成的XML是:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
<prop11>abc</prop11>
<prop13>def</prop13>
<prop15>def</prop15>
</prop1>
</Root>
如果您不关心xsi:nil
是否属实,并且您只想删除所有xsi:nil
属性的节点,则可以将XPath设置为:
IEnumerable<XElement> result = root.XPath("//*[@xsi:nil]");
答案 1 :(得分:0)
使用Linq to XML
using System.Xml.Linq;
var f = XDocument.Load("c:\\01.xml");
var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
var nills = from n in f.Root.Elements("prop1").Elements()
where n.Attribute(xsi + "nil") != null
select n;
nills.ToList().ForEach(x => x.RemoveAttributes());
f.Save("c:\\011.xml");
这产生了以下结果:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
<prop11>abc</prop11>
<prop12 />
<prop13>def</prop13>
</prop1>
</Root>