2014-01-23 2 views
2

Я пытаюсь вызвать метод API третьей части, подпись выглядитчтение из строки X до линии Y от Xaml с XamlXmlReader

object Load(XamlXmlReader reader); 

Затем дал этот образец XAML

<Foo xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:barns="clr-namespace:Bar;assembly=Bar" 
    Property="Value"> 
    <Root> 
     <Element1 /> 
     <Element2> 
      <SubElement> 
       <barns:Sample /> 
      </SubElement> 
     </Element2> 
    </Root> 
</Foo> 

мне нужно предоставить API-интерфейс с XamlXmlReader, что нагрузка от, не позволяет сказать, [строка 7, столбец 12] до [9 строки, столбца 25]

<SubElement> 
    <barns:Sample /> 
</SubElement> 

Окончательный Xaml на прочитанном читатель должен быть

<Foo xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:barns="clr-namespace:Bar;assembly=Bar" 
    Property="Value"> 
     <SubElement> 
      <barns:Sample /> 
     </SubElement> 
</Foo> 

Есть ли функция, которая делает этот вид чтения? Если мне нужно сворачивать свои собственные, любые предложения или ресурсы, помимо создания другого файла с этим контентом вручную из необработанной строки, что может помочь? (Я не знаком с XamlXmlReader) Что такое IXamlLineInfo и XamlXmlReaderSettings.ProvideLineInfo?

Благодаря

ответ

1

Это решение, которое я нашел, он использует LINQ к XML, не стесняйтесь предложить улучшения.

public static XDocument CreateDocumentForLocation(Stream stream, Location targetLocation) 
    { 
     stream.Seek(0, 0); 
     XElement root; 
     List<XNode> nodesInLocation; 
     XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml"; 
     using (var xmlReader = XmlReader.Create(stream, new XmlReaderSettings { 
      CloseInput = false })) 
     { 
      XDocument doc = XDocument.Load(xmlReader, 
       LoadOptions.SetLineInfo | LoadOptions.PreserveWhitespace); 

      root = doc.Root; 
      nodesInLocation = doc.Root.DescendantNodes() 
       .Where(node => IsInside(node, targetLocation)) 
       .ToList(); 
     } 

     root.RemoveNodes(); 
     XDocument trimmedDocument = XDocument.Load(root.CreateReader()); 
     trimmedDocument.Root.Add(nodesInLocation.FirstOrDefault()); 

     return trimmedDocument; 
    } 

    public static bool IsInside(XNode node, Location targetLocation) 
    { 
     var lineInfo = (IXmlLineInfo)node; 
     return (lineInfo.LineNumber > targetLocation.StartLine && lineInfo.LineNumber < targetLocation.EndLine) // middle 
      || (lineInfo.LineNumber == targetLocation.StartLine && lineInfo.LinePosition >= targetLocation.StartColumn) // first line after start column 
      || (lineInfo.LineNumber == targetLocation.EndLine && lineInfo.LinePosition <= targetLocation.EndColumn); // last line until last column 
    } 

Мне нужно было вставить некоторые другие элементы в xml в моем приложении. Это основной фрагмент, вы можете использовать linq для xml для простого запроса всего, что вы хотите добавить к окончательному XML.

 Смежные вопросы

  • Нет связанных вопросов^_^