2017-03-31 101 views
3

我想從輸入中讀取字符串XML片段,使用XmlReader,操作XDocument並將結果輸出爲字符串。
如果有一個對未知XML名稱空間的引用,我只想保留這個引用,而不是以任何方式修改。
注意我不知道可能的命名空間列表,因此手動創建命名空間白名單不是一個選項。
我的目標是UWP平臺,所以XmlTextReader不能在這裏使用。如何用C#XmlReader忽略未知的命名空間?

採樣輸入XML文檔:

<VisualState x:Name="Disabled"> 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" /> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" /> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}" /> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 

預期輸出XML文檔的樣本:

<VisualState x:Name="Disabled"> 
    <VisualState.Setters> 
    <Setter Target="RootGrid.Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" /> 
    <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" /> 
    <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource SystemControlDisabledTransparentBrush}" /> 
    </VisualState.Setters>  
</VisualState> 

我目前的解析XML代碼:

using (StringReader sr = new StringReader(xml)) 
{ 
    using (XmlReader xtr = XmlReader.Create(sr)) 
    { 
     return XDocument.Load(xtr); 
    } 
} 
+0

我認爲這個問題是拋出一個異常?由於XML片段不是缺少名稱空間聲明的有效XML文檔,因此您在這裏有點困難。 'XmlTextReader'有一個關閉命名空間支持的模式(並允許冒號作爲名稱字符),但我認爲你不會在其他任何地方找到它。 –

回答

-1

沒有忽視他們只是接受無論何時在場。

xml.Load(fil); 
var ns = new XmlNamespaceManager(xml.NameTable); 
var nsNode = xml.DocumentElement.Attributes.GetNamedItem("xmlns"); 
var nsurl = (nsNode != null) ? nsNode.Value : ""; 

ns.AddNamespace("ns", nsurl); 

如果你現在使用前綴所有的XPath(如果有的話)「NS:」並通過命名空間管理作爲參數,你應該罰款:

var nodeList = xml.SelectNodes("//ns:whatever", ns); 

編輯:這是使用XmlDocument,而不是XDocument,但也應該讓你去。

+0

不要認爲這會有所幫助。基於問題中的XML,這將在'xml.Load'處引發異常。 –