Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过正则表达式删除xsi nil_C#_.net_Xml_Regex - Fatal编程技术网

C# 通过正则表达式删除xsi nil

C# 通过正则表达式删除xsi nil,c#,.net,xml,regex,C#,.net,Xml,Regex,我有一个第三方组件,它生成序列化的xml和存储过程,用于解析xml并将值插入表中 我在组件和sql存储过程中处理xsi nil时遇到问题。我无法控制更改组件或存储过程。因此,属性解决方案上的IsNullable属性,而过程解决方案上的xsi=true属性对我没有帮助 我正试图用正则表达式处理这个问题 .*xsi\:nil\=\"true\" \/\> 上面的正则表达式匹配非常适合下面的输入 <Root xmlns:xsi="http://www.w3.org/2001/XMLSch

我有一个第三方组件,它生成序列化的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>

abc
def
但不是为了这个输入

<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>
abcdef
期望输出为

<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>

abc
def
更新: 属性名称和级别仅在运行时已知。请参考下面不同的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>

abc
def
瓦尔1
瓦拉
上述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>

abc
def
瓦尔1
瓦拉
有人能帮帮我吗

谢谢


Esen使用此库中的XPath:

我通过以下方式获得具有
xsi:nil=true
的元素:

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();

使用此库中的XPath:

我通过以下方式获得具有
xsi:nil=true
的元素:

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();
使用Linq转换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>

abc
def
使用Linq到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>

abc
def

是否替换该值?用什么?期望的结果是什么?用空字符串替换它调整我的答案以得到期望的结果。你正在替换值吗?用什么?IE,期望的结果是什么?用空字符串替换它调整我的答案以给你期望的结果。谢谢chuck,有可能使它通用吗。因为我不知道属性名。并且包含null值的属性的级别也是未知的。请参考我的第二个例子谢谢chuck,有没有可能让它更通用。因为我不知道属性名。并且包含null值的属性的级别也是未知的。请参考我的第二个例子